如何从 Javascript 中的二维数组创建对象数组?
How to create an array of objects from a 2d array in Javascript?
这类似于我的实际问题,但我觉得说明了我需要解决的问题而不会使事情复杂化。
我需要通过遍历二维数组来创建一个对象数组。
二维数组看起来像下面的 "sampleArray"。
let sampleArray = [
["open",2],
["high",3],
["low",5],
["close", 10],
["volume", 20],
["open",20],
["high",30],
["low",50],
["close", 100],
["volume", 21],
["open",21],
["high",33],
["low",51],
["close", 1],
["volume", 2],
["open",7],
["high",8],
["low",5],
["close", 11],
["volume", 22]
];
我目前正在格式化一组特别难看的 API 数据,并将数据扁平化为二维数组。我现在需要的是将这些值放入一个包含 5 个对象的数组中,其中每个对象的数据 属性 由具有该特定标签的所有值填充。
newObject = [
{
data: [2,20,21, ...]
label: "open"
},
{
data: [3,50, ...]
label: "high"
},
{
data: [etc...]
label: "low"
},
{
data: [etc...]
label: "close"
},
{
data: [etc...]
label: "volume"
}
]
我花了大约 3 个小时来尝试完成这项工作,但我觉得我做的一切都是错误的,我不断收到 newArray[i]["label"] 未定义的错误,我明白为什么会这样(还没有 属性 的对象存在,
我只是不确定如何在 javascript.[=14 中表达这个想法(如果带有该标签的对象尚不存在,请创建它并将该匹配值添加到它的值 属性) =]
function makeArray(array) {
let newArray = [];
for(let i = 0; i <= array.length; i++){
if(newArray[i]["label"] !== array[i][0]){
newArray.push({
"label": array[i][0],
"value": array[i][1]
})
}
else{
newArray.push({
"value": array[i][1]
})
}
}
return newArray;
}
let test = makeArray(sampleArray);
console.log(test);
抱歉这么久 post,我一整天都在平息这场噩梦 API,感觉我现在 运行 就在原地。与直接回答相比,我更喜欢指向正确方向的观点。我要去上班,看看是否有人可以在早上之前为我提供一些观点。谢谢!
您可以使用 reduce
let sampleArray = [
["open", 2],
["high", 3],
["low", 5],
["close", 10],
["volume", 20],
["open", 20],
["high", 30],
["low", 50],
["close", 100],
["volume", 21],
["open", 21],
["high", 33],
["low", 51],
["close", 1],
["volume", 2],
["open", 7],
["high", 8],
["low", 5],
["close", 11],
["volume", 22]
];
let newObject = Object.values(sampleArray.reduce((c, [n, v]) => {
c[n] = c[n] || {label: n,data: []};
c[n].data.push(v);
return c;
}, {}));
console.log(newObject);
Using Vanilla JS:
let sampleArray = [
["open", 2],
["high", 3],
["low", 5],
["close", 10],
["volume", 20],
["open", 20],
["high", 30],
["low", 50],
["close", 100],
["volume", 21],
["open", 21],
["high", 33],
["low", 51],
["close", 1],
["volume", 2],
["open", 7],
["high", 8],
["low", 5],
["close", 11],
["volume", 22]
];
function transform(sampArr) {
let obj = {}; // A map equivalent to store repeated value
// Loop through each array within array
sampArr.forEach(function(arr) {
if (!obj[arr[0]]) {
obj[arr[0]] = {}; // Instantiate the map the first time
}
if (!obj[arr[0]].data) {
obj[arr[0]]["data"] = []; // First time instantiate the array
}
obj[arr[0]].data.push(arr[1]); // Push the repeated values
});
// Create the structure you want
return Object.keys(obj).map(function(key) {
return {
data: obj[key].data,
label: key
};
});
}
console.log(transform(sampleArray));
您可以在进入最终值之前引入一个临时变量,如 -
const tempObject = sampleArray.reduce((acc, arr) => {
if (acc.hasOwnProperty(arr[0]) {
return acc[arr[0]].push(arr[1]);
}
return { ...acc, { [arr[0]]: [arr[1]] };
}), {});
现在 tempObject 将是 -
{
'open': [2, 20, 21, ...],
'high': [3, 50, ...],
'low': [etc, ...],
'close': [etc, ...],
'volume': [etc, ...]
}
然后你可以将上面的对象迭代为,
const finalData = Object.keys(tempObject).map(key => (
{
data: tempObject[key],
label: key
}
);
现在 finalData 将是所需的对象。
这类似于我的实际问题,但我觉得说明了我需要解决的问题而不会使事情复杂化。
我需要通过遍历二维数组来创建一个对象数组。 二维数组看起来像下面的 "sampleArray"。
let sampleArray = [
["open",2],
["high",3],
["low",5],
["close", 10],
["volume", 20],
["open",20],
["high",30],
["low",50],
["close", 100],
["volume", 21],
["open",21],
["high",33],
["low",51],
["close", 1],
["volume", 2],
["open",7],
["high",8],
["low",5],
["close", 11],
["volume", 22]
];
我目前正在格式化一组特别难看的 API 数据,并将数据扁平化为二维数组。我现在需要的是将这些值放入一个包含 5 个对象的数组中,其中每个对象的数据 属性 由具有该特定标签的所有值填充。
newObject = [
{
data: [2,20,21, ...]
label: "open"
},
{
data: [3,50, ...]
label: "high"
},
{
data: [etc...]
label: "low"
},
{
data: [etc...]
label: "close"
},
{
data: [etc...]
label: "volume"
}
]
我花了大约 3 个小时来尝试完成这项工作,但我觉得我做的一切都是错误的,我不断收到 newArray[i]["label"] 未定义的错误,我明白为什么会这样(还没有 属性 的对象存在, 我只是不确定如何在 javascript.[=14 中表达这个想法(如果带有该标签的对象尚不存在,请创建它并将该匹配值添加到它的值 属性) =]
function makeArray(array) {
let newArray = [];
for(let i = 0; i <= array.length; i++){
if(newArray[i]["label"] !== array[i][0]){
newArray.push({
"label": array[i][0],
"value": array[i][1]
})
}
else{
newArray.push({
"value": array[i][1]
})
}
}
return newArray;
}
let test = makeArray(sampleArray);
console.log(test);
抱歉这么久 post,我一整天都在平息这场噩梦 API,感觉我现在 运行 就在原地。与直接回答相比,我更喜欢指向正确方向的观点。我要去上班,看看是否有人可以在早上之前为我提供一些观点。谢谢!
您可以使用 reduce
let sampleArray = [
["open", 2],
["high", 3],
["low", 5],
["close", 10],
["volume", 20],
["open", 20],
["high", 30],
["low", 50],
["close", 100],
["volume", 21],
["open", 21],
["high", 33],
["low", 51],
["close", 1],
["volume", 2],
["open", 7],
["high", 8],
["low", 5],
["close", 11],
["volume", 22]
];
let newObject = Object.values(sampleArray.reduce((c, [n, v]) => {
c[n] = c[n] || {label: n,data: []};
c[n].data.push(v);
return c;
}, {}));
console.log(newObject);
Using Vanilla JS:
let sampleArray = [
["open", 2],
["high", 3],
["low", 5],
["close", 10],
["volume", 20],
["open", 20],
["high", 30],
["low", 50],
["close", 100],
["volume", 21],
["open", 21],
["high", 33],
["low", 51],
["close", 1],
["volume", 2],
["open", 7],
["high", 8],
["low", 5],
["close", 11],
["volume", 22]
];
function transform(sampArr) {
let obj = {}; // A map equivalent to store repeated value
// Loop through each array within array
sampArr.forEach(function(arr) {
if (!obj[arr[0]]) {
obj[arr[0]] = {}; // Instantiate the map the first time
}
if (!obj[arr[0]].data) {
obj[arr[0]]["data"] = []; // First time instantiate the array
}
obj[arr[0]].data.push(arr[1]); // Push the repeated values
});
// Create the structure you want
return Object.keys(obj).map(function(key) {
return {
data: obj[key].data,
label: key
};
});
}
console.log(transform(sampleArray));
您可以在进入最终值之前引入一个临时变量,如 -
const tempObject = sampleArray.reduce((acc, arr) => {
if (acc.hasOwnProperty(arr[0]) {
return acc[arr[0]].push(arr[1]);
}
return { ...acc, { [arr[0]]: [arr[1]] };
}), {});
现在 tempObject 将是 -
{
'open': [2, 20, 21, ...],
'high': [3, 50, ...],
'low': [etc, ...],
'close': [etc, ...],
'volume': [etc, ...]
}
然后你可以将上面的对象迭代为,
const finalData = Object.keys(tempObject).map(key => (
{
data: tempObject[key],
label: key
}
);
现在 finalData 将是所需的对象。