我查看了类似的问题,并尝试了Object.key(patientList).length但它返回0.我建议使用回调,这就是我如何实现它。
var data;
var patientList = {};
var parseDate = d3.time.format("%d/%m/%y").parse;
function input_Data() {
d3.json("data.php", function(error, json) {
if (error) return console.warn(error);
data = json;
console.log(data);
for(var i = 0; i < data.length; i++) {
var name = data[i].name;
//data[i].dates = parseDate(data[i].dates);
if(!patientList[name]) {
var newPatient = {
dates: [data[i].dates],
alpha: data[i].alpha,
beta: data[i].beta
};
patientList[name] = newPatient;
} else {
patientList[name].dates.push(data[i].dates);
}
}
console.log(patientList);
console.log(Object.keys(patientList).length);
console.log(Object.keys(patientList));
});
}
function number_of_patients(callback) {
callback();
console.log(patientList);
console.log(Object.keys(patientList).length);
console.log(Object.keys(patientList));
}
number_of_patients(input_Data);
input_Data函数内的console.log显示长度为4的正确结果.sumber_of_patients中的console.log显示正确的patientList,但长度为0,并且不显示名称(键)。我已经阅读了类似的帖子,但仍然无法解决这个问题。
非常感谢任何帮助。
答案 0 :(得分:1)
在Javascript中,不的通用对象具有length属性。
有关Javascript对象的常见事实:
Object.keys()
,可以像一些第三方库一样明确调用,如underscore.js {}
和key:value
对在此之前,计算或访问对象的特定实例所特有的所有键的常用方法是使用如下循环:
l=0;
for(var k in obj){
if (obj.hasOwnProperty(k)){
// hasOwnProperty ignores keys from the prototype chain
// do something with key k, value obj[k]
++l;
}
}
// the object has l keys specific to this instance
如果您需要快速获得length
,则应考虑使用数组对象:
x = [1,2,3,'sam',{'name':'fred', 'status': 'dead'}]
)具有以0开头的数字索引,并且可以包含任意类型的成员。 x.length
是5)x[2]
为3 []
,其中包含以逗号分隔的值列表正如其他人在评论中所说,异步调用通常会立即返回 - 并且没有您想要的范围内的数据或对象。要访问数据,您必须在定义数据的上下文中执行代码,即编写访问回调函数中的异步数据/对象的代码,而不是主代码。