繁体   English   中英

将两个arrays组合成一个javascript object

[英]Combining two arrays to form a javascript object

我有两个 arrays:

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

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

我正在尝试将它们组合成一个 javascript object 用于行数组中的每个项目。 之后,我想将每个 object 推入一个新数组。

喜欢:

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);

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

我以前试过这样:

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)
}

上面的代码只一次又一次地存储了第一项(根据rows.length)。

我不明白如何将列名与行结合起来创建对象数组。 “行”包含 arrays 的事实尤其令人困惑..

您也可以以更以数据为中心的方式执行此操作:

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;
  }, {});
});

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

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

在外循环的每次迭代开始时创建一个新的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)
}

“'rows' 包含数组的事实尤其令人困惑..”

对于您的示例数据, rows.length将为 3,而rows[0]是数组:

["2001", "5", "Big", "Sydney", "25"]

rows[0][3]是“悉尼”。

以它为例,您应该能够看到rows[y][i]将为您提供yi每个值......

如果您使用的是_.object(list, [values])则有_.object(list, [values])

这是它的实现方式:

_.object = function(list, values) {
  if (list == null) return {};
  var result = {};
  for (var i = 0, length = list.length; i < length; i++) {
    if (values) {
      result[list[i]] = values[i];
    } else {
      result[list[i][0]] = list[i][1];
    }
  }
  return result;
};

使用函数就像 nnnnnn 所说的那样,但有一个小的更正

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
  }, {});
});

你可以在 ES6 代码之后使用这个函数:

const assemblyData = ( columns, rows) => {
   return rows.map((row) => {
       return row.reduce((res, field, index) => {
         res[columns[index]] = field;
         return res
       }, {});
  });
}

// short version
const assemblyDataMin = (columns, rows) =>
  rows.map(row =>
    row.reduce((res, field, index) => {
      res[columns[index]] = field;
      return res;
    }, {})
  );

链接到示例

您需要指定正确的行。 您正在使用该列。 rows[y][i]替换rows[i][i] rows[y][i] 此外,看起来您正在一遍又一遍地重复使用相同的thing对象。 相反,您应该通过数组( var thing = {}; )的每次迭代重新定义它。

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

我认为我的解决方案是解决你的问题

代码:

    var keys = columns,
        values = rows,
        finalarray = [];

        values.forEach((data,index) =>{
            var objJSON = new Object();
            for (i = 0; i < keys.length; i++) {
                objJSON[keys[i]] = data[i];
               }
            finalarray.push(objJSON);  
        });

回答:

console.log(finalarray)

[{
   "Date" : "2001",
   "Number" : "5",
   "Size":"Big",
   "Location":"Sydney",
   "Age":"25"
},
...
}]

使用现代 JS,您可以使用Object.fromEntries()为您构建 object:

 const columns = ["Date", "Number", "Size", "Location", "Age"]; const rows = [["2001", "5", "Big", "Sydney", "25"],["2005", "2", "Med", "Melbourne", "50"],["2012", "20", "Huge", "Brisbane", "80"]]; const res = rows.map(row => Object.fromEntries( columns.map((key, i) => [key, row[i]])) ); console.log(res);

上面,我正在为rows中的每一row构建一个[[key1, value1], [key2, value2], ...]形式的数组,并将其传递给.map() Object.fromEntries()调用,它从{key1: value1, key2: value2}形式的键值对数组中为我们构建了一个 object。

您可以将Array.prototype.map()Object.fromEntries( ) 结合使用

代码:

 const columns = ["Date", "Number", "Size", "Location", "Age"]; const rows = [["2001", "5", "Big", "Sydney", "25"],["2005", "2", "Med", "Melbourne", "50"],["2012", "20", "Huge", "Brisbane", "80"]] const result = rows.map(r => Object.fromEntries(r.map((c, i) => [columns[i], c]))) console.log(result)

你只需要重置thing

 for(var y = 0; y < rows.length; y++){
   for(var i = 0; i < columns.length; i++){
       thing[columns[i]] = rows[y][i];
   }

   newarray.push(thing);
   thing = {};    
 }

见更新:小提琴

您还可以使用 columns 数组生成一个 Row 类(使用defineProperty ),而不是遍历整个表,然后使用该行类将行数组包装在行数组中。 然后将生成的 Row 对象数组绑定到原始行数组,这样一个数组中的更改就会反映在另一个中。 根据您的用例,这可能有用或有问题。 下面的代码片段中给出了一个工作示例。

 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 table = create_table(columns, rows); // for (var i = 0; i<table.length; i++) { document.writeln("The thing in " + table[i].Location + " is " + table[i].Size + "<br/>"); } // The rows in table are still tied to those in the rows variable table[0].Size = "Small"; document.writeln(JSON.stringify(rows[0])); function create_table(columns, rows) { // Create a Row class with the given columns for (var i=0; i<columns.length; i++) { var c = columns[i]; Object.defineProperty(Row.prototype, c, { enumerable: true, get: getter(i), set: setter(i), }); } // Wrap the rows in row objects and return the resulting array var r = new Array(rows.length); for (var i=0; i<rows.length; i++) { r[i] = new Row(rows[i]); } return r; function Row(row) { this._ = row; } // Generators for the getter and setter functions, with variable i stored in a closure. function getter(i) { return function(){ return this._[i]; }; } function setter(i) { return function(val){ return this._[i] = val; }; } }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM