简体   繁体   English

在JavaScript中将键添加到数组

[英]Add key to array in javascript

I have an array of data, with first line being a header: 我有一个数据数组,第一行是标题:

[["Date", "Key1", "Key2", "Key3", "Key4"],
["2018-11-01", "254", "-", "-", "-"],
["2018-11-02", "648", "-", "-", "-"],
["2018-11-03", "270", "170", "-", "147"],
["2018-11-04", "300", "406", "136", "208"]]

The output I would like to have to be able to use it with a D3 library graph would be: 我希望能够与D3库图一起使用的输出为:

[[Date: "2018-11-01", Key1: "254", Key2: "-", Key3: "-", Key4: "-"],
[Date: "2018-11-02", Key1: "648", Key2: "-", Key3: "-", Key4: "-"],
[Date: "2018-11-03", Key1: "270", Key2: "170", Key3: "-", Key4: "147"],
[Date: "2018-11-04", Key1: "300", Key2: "406", Key3: "136", Key4: "208"]]

I tried many unsuccessful variations to do that with javascript, using map. 我尝试了许多失败的变体,使用javascript,并使用map来完成该任务。 but I can't manage to do it... Keys are dynamic so I can't use fixed keys. 但是我无法做到这一点...按键是动态的,所以我不能使用固定键。 Can someone help me? 有人能帮我吗? Thank you! 谢谢! Manue Manue

For an array of objects, you could map the values and take mapped objects, which are assigned to a single object. 对于对象数组,您可以映射值并获取映射的对象,这些对象已分配给单个对象。

 var data = [["Date", "Key1", "Key2", "Key3", "Key4"], ["2018-11-01", "254", "-", "-", "-"], ["2018-11-02", "648", "-", "-", "-"], ["2018-11-03", "270", "170", "-", "147"], ["2018-11-04", "300", "406", "136", "208"]], result = data.slice(1).map(a => Object.assign(...a.map((v, i) => ({ [data[0][i]]: v })))); console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

You need to map your inner arrays to objects. 您需要将内部数组映射到对象。 You cannot assign key-value pairs within an array construct. 您不能在数组构造中分配键值对。

 var matrix = [ [ "Date", "Key1", "Key2", "Key3", "Key4" ], [ "2018-11-01", "254", "-", "-", "-" ], [ "2018-11-02", "648", "-", "-", "-" ], [ "2018-11-03", "270", "170", "-", "147" ], [ "2018-11-04", "300", "406", "136", "208" ] ]; console.log(JSON.stringify(matrixToJsonObjectArray(matrix, true), null, 2)); function matrixToJsonObjectArray(matrix, includesHeader) { var fields = includesHeader ? matrix[0] : range(matrix[0].length); return (includesHeader ? matrix.slice(1) : matrix).map(row => { var obj = {}; fields.forEach((field, i) => obj[field] = row[i]); return obj; }); } function range(start, end) { var arr = []; if (end === undefined) end = start, start = 0; for (var i = start; i < end; i++) arr.push(i); return arr; } 
 .as-console-wrapper { top: 0; max-height: 100% !important; } 

You can create a zipObject method that converts to arrays to object using Array.reduce() , and use it with Array.map() to combine the header array, with the other arrays: 您可以创建一个zipObject方法,该方法使用Array.reduce()转换为对象数组,并将其与Array.map()结合使用,以将标头数组与其他数组组合在一起:

 const data = [["Date", "Key1", "Key2", "Key3", "Key4"], ["2018-11-01", "254", "-", "-", "-"], ["2018-11-02", "648", "-", "-", "-"], ["2018-11-03", "270", "170", "-", "147"], ["2018-11-04", "300", "406", "136", "208"]]; // zip two arrays to an object const zipObject = (keys) => (values) => keys.reduce((r, key, i) => ({ ...r, [key]: values[i] }), {}); // convert a two dimensional array to object const arrToObj = ([keys, ...values]) => values.map(zipObject(keys)); const result = arrToObj(data); console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

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

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