Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
组合两个数组以形成javascript对象_Javascript_Arrays_Object - Fatal编程技术网

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

组合两个数组以形成javascript对象,javascript,arrays,object,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"]]; 我正在尝试将它们组合到rows数组中每个项目的javascript对象中。之后,我想将每个对象

我有两个阵列:

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

var rows = [["2001", "5", "Big", "Sydney", "25"],["2005", "2", "Med", "Melbourne", "50"],["2012", "20", "Huge", "Brisbane", "80"]];
我正在尝试将它们组合到rows数组中每个项目的javascript对象中。之后,我想将每个对象推送到一个新数组中

比如:

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

我以前就这样试过:

       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)
       }
for(变量y=0;y
上面的代码只反复存储第一项(根据rows.length)


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

您需要指定正确的行。您正在使用该列。将
行[i][i]
替换为
行[y][i]
。另外,看起来您正在反复使用相同的
对象。相反,您应该在数组的每次迭代中重新定义它(
var thing={};

var newarray=[];
对于(变量y=0;y
您只需重置
东西

 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 = {};    
 }
for(变量y=0;y

请参见更新:

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

行[0][3]
为“Sydney”


以此为例,您应该能够看到
行[y][i]
对于
y
i
的每一个值会给您带来什么,…

您也可以以更为以数据为中心的方式来做这件事:

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;
  }, {});
});
这样您就不必处理临时数组


如果您的代码也可以在古老的浏览器上使用,我建议您看看如何使用
map
+
reduce

如果您使用的是下划线.js

下面是它的实现方式:

_.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;
};
\uuu0.object=函数(列表、值){
if(list==null)返回{};
var result={};
for(var i=0,length=list.length;i
使用functional就像nnnn所说的那样,但需要稍加修改

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

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

var列=[“日期”、“数量”、“大小”、“位置”、“年龄”];
变量行=[
[“2001”、“5”、“大”、“悉尼”、“25”],
[“2005”、“2”、“Med”、“墨尔本”、“50”],
[“2012”、“20”、“巨大”、“布里斯班”、“80”]
];
var table=创建表格(列、行);
// 

对于(var i=0;i我认为我的解决方案是解决你的问题

代码:

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

您可以按照以下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;
    }, {})
  );

谢谢,我试过这样做,但我也遇到了同样的问题。请看:。我遗漏了什么吗?@Tamarasauss,你看到我的最新更新了吗?我添加了一个部分,指定你需要设置
var thing=[]
循环的每次迭代。您的JSFIDLE没有显示这一点。@BenLee,
东西
是一个对象,而不是一个对象Array@epoch,你是对的,这是一个输入错误。每次都更新我的答案以创建一个新对象(只需使用
{}
而不是
[]
)。还有JSFIDLE:+1。知道如何用纯javascript实现这一点很好,但为什么要重新发明轮子呢?这是最好的解决方案,IMHO。知道/使用下划线或lodash很重要。这让我朝着正确的方向走了……但最终缩短了:删除rows.map,仍然有效。
_.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;
};
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
  }, {});
});
    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"
},
...
}]
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;
    }, {})
  );