如何在javascript中压缩for循环

时间:2014-12-17 22:40:41

标签: 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;
}


问题:

我是否有更简洁的方法来设置它,这意味着,将所有这些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` */

如果您碰巧回答并知道我的方法无效的原因,那么对未来的参考/思考过程进行解释会很棒。

谢谢!

2 个答案:

答案 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;
    }