使用Javascript循环从二维数组中创建对象的键和值

5

我有两个数组,一个存储键,另一个存储数组,每个数组包含值。我想要创建一个对象数组,其中每个对象都将键和值进行配对。为此,我创建了一个数组,并尝试在将其推入数组之前创建和填充对象。我的代码类似于这样:

var keys = [key1, key2, key3];
var values = [
                [A-value1, A-value2, A-value3],
                [B-value1, B-value2, B-value3],
                [C-value1, C-value2, C-value3]
             ];

var arrayOfObjecs = [];
for(var i=0; i<values.length; i++){
    var obj = {
    for(var j=0; j<values[i].length; j++){
            keys[j] : values[i][j];
    }
    };
    arrayOfObjects.push(obj);
}

最终,我希望我的对象数组看起来像这样:
var arrayOfObjects = [
                        {
                         key1 : A-value1,
                         key2 : A-value2,
                         key3 : A-value3
                        },
                        {
                         key1 : B-value1,
                         key2 : B-value2,
                         key3 : B-value3
                        },
                        {
                         key1 : C-value1,
                         key2 : C-value2,
                         key3 : C-value3
                        }
                     ];

这个问题与我想要做的类似,但它不允许我在对象内部再次循环。


需要我进行几次编辑,但现在我的答案应该可以工作了 :) - Matthew Graves
3个回答

7

您的问题实际上是关于对象属性方括号表示法:
使用 object[propertyname] 与使用 object.propertyname 是相同的。

var myObj  = {};
myObj['x'] = 12;
console.log(myObj.x);  -->> prints 12

现在在你的代码中:
var arrayOfObjects = [];
for(var i=0; i<values.length; i++){
    var obj = {};
    for(var j=0; j<values[i].length; j++){
         obj[keys[j]] = values[i][j];  
      }
    arrayOfObjects.push(obj);
}

作为对“它会出现奇怪的情况”的回应:这段代码是有效的。
使用以下输入:
var keys = ['key1', 'key2', 'key3'];
var values = [
            [12,112, 1112],
            [31, 331, 3331],
            [64, 65, 66]
         ];

输出结果为:
   {   {key1: 12, key2: 112, key3: 1112},  
       {key1: 31, key2: 331, key3: 3331},   
       {key1: 64, key2: 65, key3: 66}        }

fiddle在这里: http://jsfiddle.net/fyt8A/


那会出现奇怪的事情...你同时迭代值和键。 - Bergi
它只做了预期的事情。 - GameAlchemist
http://stackoverflow.com/revisions/17353800/1 做了 :-) 当我发表评论时,你的编辑还没有加载。 - Bergi

1
尝试:
var arrayOfObjecs = values.map(function(value_set){
                                  var obj = {}; 
                                  for(i = 0; i < keys.length; i++ )
                                        obj[keys[i]]=value_set[i];      
                                  return obj;})

map是一个很好的函数,用于循环遍历数组


0

你的方向是正确的。

var obj = {
    for(var j=0; j<values[i].length; j++){
        keys[j] : values[i][j];
    }
    };
…

这是一个语法错误。你不能把for循环放在对象字面量的中间。相反,可以通过一步创建空对象,然后使用赋值(使用方括号表示法)在循环中填充属性:

…
    var obj = {};
    for(var j=0; j<values[i].length; j++){
         obj[keys[j]] = values[i][j];
    }
…

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接