如何在javascript中压缩for循环

Bae*_*ins 0 javascript for-loop

我有以下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;
}
Run Code Online (Sandbox Code Playgroud)


题:

有没有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;
}
Run Code Online (Sandbox Code Playgroud)

这会返回错误: Uncaught TypeError: Cannot read property 'length' of undefined

我也移动var terms = data.terms到循环,这允许函数工作,但classList返回填充'undefined'而不是真正的值.

样本 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` */
Run Code Online (Sandbox Code Playgroud)

如果您碰巧回答并知道为什么我的方法不起作用,那么对于将来的参考/思考过程来说,解释会很棒.

谢谢!

Chr*_*lin 5

更改的访问terms.currentTerm.lengthterms[currentTerm].length.这应该可以解决你的错误.

说明

for例如,在第一个循环的第一次迭代中,terms.currentTerm不访问terms.day.它会访问currentTermterms对象上指定的属性.此属性不terms存在 - 没有名为的属性currentTerm- 并且尝试访问length不存在的对象会产生错误.

如果要使用termscurrentTerm变量值相同的名称访问属性,请使用括号表示法,以便currentTerm改为使用的值:terms[currentTerm].口译员"读"这个terms['day'],这是你真正想要的.

  • 不,它没有说'terms.'day'.真的不.它只是说`terms.currentTerm`,相当于`terms ['currentTerm']`. (2认同)