数组列表的字典列表

时间:2017-10-01 17:11:49

标签: javascript javascript-objects

我将此传递给函数Data(array):

[
[
    ['firstName', 'Joe'], ['lastName', 'low']
  ],
[
    ['firstName', 'Steph'], ['lastName', 'Roberts']
]
]

想要输出:

[
{firstName: 'Joe', lastName: 'low'},
{firstName: 'Steph', lastName: 'Roberts'}
]

这就是我所拥有的:

function Data(array) {
var dict ={};
for(var j =0; j<=array.length-1; j++){
  for(var i=0; i<=array[0].length-1; i++){
    dict[array[j][i][0]] = array[j][i][1];
  }
}
return dict
}

但输出不正确:

{ firstName: 'Steph',
lastName: 'Roberts',
}

5 个答案:

答案 0 :(得分:2)

您正在每次迭代时更新相同的对象,而是应该在每次迭代时创建新对象并将其推送到数组

&#13;
&#13;
function Data(array) {
    var dict = [];
    for(var j =0; j<=array.length-1; j++) {
        dict[j] = {};
        for(var i=0; i<=array[0].length-1; i++) {
            dict[j][array[j][i][0]] = array[j][i][1];
        }
    }
    return dict;
}

console.log(Data([
    [
        ['firstName', 'Joe'], ['lastName', 'low']
    ],
    [
        ['firstName', 'Steph'], ['lastName', 'Roberts']
    ]
]));
&#13;
&#13;
&#13;

答案 1 :(得分:1)

array[j]替换array[0]的{​​{1}},将数组设置为i<=array[0].length-1;对象的属性

dict

答案 2 :(得分:1)

您可以将数组作为结果,并为每个外部项目选择一个dictinary。

function getArrayOfObjects(array) {
    var result = [],
        dict,
        i, j;
      
    for (j = 0; j < array.length; j++) {
        dict = {};
        for (i = 0; i < array[0].length; i++) {
            dict[array[j][i][0]] = array[j][i][1];
        }
        result.push(dict);
    }
    return result;
}

var array = [[['firstName', 'Joe'], ['lastName', 'low']], [['firstName', 'Steph'], ['lastName', 'Roberts']]];

console.log(getArrayOfObjects(array));

ES6 with

function getArrayOfObjects(array) {
    return array.map(a => Object.assign(...a.map(([k, v]) => ({ [k]: v }))))
}

var array = [[['firstName', 'Joe'], ['lastName', 'low']], [['firstName', 'Steph'], ['lastName', 'Roberts']]];

console.log(getArrayOfObjects(array));

答案 3 :(得分:1)

AvcS的答案包含您的代码失败的原因。 Nina的解决方案是完美的,如果您可以使用像Babel这样的转换器,因为浏览器对destructuring assignment的支持看起来非常糟糕。

作为替代方案,您还可以使用mapreduce,这可能会简化所需的代码:

let inp = [
  [['firstName', 'Joe'], ['lastName', 'low']],
  [['firstName', 'Steph'], ['lastName', 'Roberts']]
];

let result = inp.map(
  entry => entry.reduce(
    (obj, keyvalue) => {
      obj[keyvalue[0]] = keyvalue[1];
      return obj;
    }, {})
);

console.log(result);

不要忘记为mapreplace添加polyfill,也可以替换let和箭头函数。

答案 4 :(得分:0)

您应该为所需的输出而不是对象声明一个数组变量。对象将创建 JSON ,但您希望结果为数组格式的 JSON 对象

function Data(array)  { 
 var res=[]; 
var dict ={}; 
 for(var j =0; j<=array.length-1; j++) 
{  
for(var i=0;i<=array[0].length-1; i++) 
{  
dict[array[j][i][0]] = array[j][i][1]; 
}
res.push(dict); 
 }  
return res;  
}