组合两个数组以形成一个javascript对象

tam*_*rus 21 javascript arrays object

我有两个数组:

var columns = ["Date", "Number", "Size", "Location", "Age"];

var rows = [["2001", "5", "Big", "Sydney", "25"],["2005", "2", "Med", "Melbourne", "50"],["2012", "20", "Huge", "Brisbane", "80"]];
Run Code Online (Sandbox Code Playgroud)

我正在尝试将它们组合成行数组中每个项目的javascript对象.之后,我想将每个对象推送到一个新数组中.

喜欢:

var newarray = [];

//'thing' should be the same structure for each row item
var thing = {
   "Date" : "2001",
   "Number" : "5",
   "Size":"Big",
   "Location":"Sydney",
   "Age":"25"
}

newarray.push(thing);
Run Code Online (Sandbox Code Playgroud)

当我知道列的名称时,我可以这样做,但是当列名未知时 - 我需要能够以这种方式存储数据 - 即基于列数组的索引.

我之前尝试过这样做:

       for(var y = 0; y < rows.length; y++){

            for(var i = 0; i < columns.length; i++){
                 thing[columns[i]] = rows[i][i];
           }
              newarray.push(thing)
       }
Run Code Online (Sandbox Code Playgroud)

上面的代码只是反复存储第一个项目(根据rows.length).

我不明白如何将列名与行组合以创建对象数组.'rows'包含数组的事实尤其令人困惑.

Tha*_*bas 25

你也可以用更加以数据为中心的方式来做到这一点:

var columns = ["Date", "Number", "Size", "Location", "Age"];

var rows = [
  ["2001", "5", "Big", "Sydney", "25"],
  ["2005", "2", "Med", "Melbourne", "50"],
  ["2012", "20", "Huge", "Brisbane", "80"]
];

var result = rows.map(function(row) {
  return row.reduce(function(result, field, index) {
    result[columns[index]] = field;
    return result;
  }, {});
});
Run Code Online (Sandbox Code Playgroud)

这样您就不必处理临时数组了.

如果您的代码也适用于古老的浏览器,我建议您查看underscore.js以使用map+ reduce.


nnn*_*nnn 12

thing在外循环的每次迭代开始时创建一个新对象.如果你不这样做,每次你说thing[columns[i]]你将覆盖同一个对象的属性,当你把它推到newarray你最终会得到的是一个充满对同一个对象的引用的数组.此外,在循环内部确保你得到正确的索引(你现在得到的[i][i]代替[y][i]):

var newarray = [],
    thing;

for(var y = 0; y < rows.length; y++){
    thing = {};
    for(var i = 0; i < columns.length; i++){
        thing[columns[i]] = rows[y][i];
    }
    newarray.push(thing)
}
Run Code Online (Sandbox Code Playgroud)

"'行'包含数组的事实特别令人困惑......"

对于您的样本数据rows.length将是3,并且rows[0]是数组:

["2001", "5", "Big", "Sydney", "25"]
Run Code Online (Sandbox Code Playgroud)

rows[0][3] 是"悉尼".

以此为例,您应该能够看到rows[y][i]为每个值yi...提供的内容.