我有以下jquery / javascript函数从json数据中获取值并将它们添加到变量中:
function get_class_classes(data) {
var terms = data.terms, // setup shortcut data path
classList = ''; // setup blank var to add string values to
for (child = 0; child < terms.day.length; child++) {
classList += terms.day[child].slug + ' ';
}
for (child = 0; child < terms.medium.length; child++) {
classList += terms.medium[child].slug + ' ';
}
for (child = 0; child < terms.term.length; child++) {
classList += terms.term[child].slug + ' ';
}
for (child = 0; child < terms.type.length; child++) {
classList += terms.type[child].slug + ' ';
}
return classList;
}
我是否有更简洁的方法来设置它,这意味着,将所有这些for
循环压缩成更简洁的东西?
以下是我的尝试:
function get_class_classes(data) {
var terms = data.terms, // setup shortcut
termsArray = ['day', 'medium', 'term', 'type'],
classList = ''; // setup blank var
for ( i=0; i < termsArray.length; i++ ) {
var currentTerm = termsArray[i];
for (child = 0; child < terms.currentTerm.length; child++) { // loop through each day, add term slug to daylis
classList += terms.currentTerm[child].slug + ' ';
}
}
return classList;
}
这会返回错误:Uncaught TypeError: Cannot read property 'length' of undefined
我还将var terms = data.terms
移到了循环中,这使得该函数可以正常工作,但classList
返回时填充了未定义的&#39;而不是真正的价值。
data
data
是一个json对象,松散地格式化了以下内容,我从控制台复制了以下内容:
terms: Object
day: Array[2]
0: Object
ID: 197
name: "Thursday"
slug: "thursday"
1: Object
medium: Array[1]
0: Object
ID: 200
name: "Painting"
slug: "painting"
/* Continues for variable amount of objects. Same is true for `term` and and `type` */
如果您碰巧回答并知道我的方法无效的原因,那么对未来的参考/思考过程进行解释会很棒。
谢谢!
答案 0 :(得分:5)
将terms.currentTerm.length
的访问权限更改为terms[currentTerm].length
。这应该可以解决你的错误。
<强>解释强>
例如,在第一个for
循环的第一次迭代中,terms.currentTerm
无法访问terms.day
。它改为访问currentTerm
对象上名为terms
的属性。此属性不存在 - terms
没有名为currentTerm
的属性 - 并且尝试访问不存在的对象上的length
会产生错误。
如果您要使用与terms
变量的值相同的名称访问currentTerm
上的媒体资源,请使用括号表示法,以便使用currentTerm
的值:{{ 1}}。口译员“读取”这个terms[currentTerm]
,这是你真正想要的。
答案 1 :(得分:0)
试试这个,但我无法真正测试它,因为我不知道除了数组之外还有什么data.terms?
function get_class_classes(data){
var terms = data.terms,
termsArray = ['day', 'medium', 'term', 'type']
classList = '';
for(var term of terms){
for(var termType of termsArray){
for(var child of terms[termType]){
classList += child.slug + ' ';
}
}
}
return classList;
}