Javascript:如何从另一个数组中创建具有“x”个属性的数组?
我想转换以下数组Javascript:如何从另一个数组中创建具有“x”个属性的数组?,javascript,arrays,Javascript,Arrays,我想转换以下数组 [{ 0-1s: 6, 1-2s: 2, country: "us" }, { 0-1s: 1, 1-2s: 4, country: "ja" }, { 0-1s: 3, 1-2s: 9, country: "ca" }] 进入如下数组: [{ time: "0-1s", us: 6, ja: 1, ca: 3 },{ time: "1-2s", us: 2, ja: 4,
[{
0-1s: 6,
1-2s: 2,
country: "us"
}, {
0-1s: 1,
1-2s: 4,
country: "ja"
}, {
0-1s: 3,
1-2s: 9,
country: "ca"
}]
进入如下数组:
[{
time: "0-1s",
us: 6,
ja: 1,
ca: 3
},{
time: "1-2s",
us: 2,
ja: 4,
ca: 9
}]
我们的想法是调整我的数组,使country字段成为一个新的属性,每个国家花费的时间为一个桶,因此无论有多少个国家,我的数组中只有2个元素,其中国家和属性的数量相同。这只是一个示例,我有40多个国家。然而,我还没有弄清楚如何在PlanJavaScript中实现这种新的数据结构
我应该如何处理这个问题?您可以使用0-1和1-2作为键将它们分组到累加器对象中。然后使用获取值数组:
常量输入=[{
0-1s:6,
1-2s:2,
国家:美国
}, {
0-1s:1,
1-2s:4,
国家:ja
}, {
0-1s:3,
1-2s:9,
国家:加利福尼亚
}]
const group=input.reducer,o=>{
r[0-1s]=r[0-1s]|{时间:0-1s};
r[1-2s]=r[1-2s]|{时间:1-2s};
r[0-1s][o.country]=o[0-1s]
r[1-2s][o.country]=o[1-2s]
返回r;
}, {}
console.logObject.valuesgrouped您可以使用它将它们分组到一个累加器对象中,其中0-1和1-2是键。然后使用获取值数组:
常量输入=[{
0-1s:6,
1-2s:2,
国家:美国
}, {
0-1s:1,
1-2s:4,
国家:ja
}, {
0-1s:3,
1-2s:9,
国家:加利福尼亚
}]
const group=input.reducer,o=>{
r[0-1s]=r[0-1s]|{时间:0-1s};
r[1-2s]=r[1-2s]|{时间:1-2s};
r[0-1s][o.country]=o[0-1s]
r[1-2s][o.country]=o[1-2s]
返回r;
}, {}
console.logObject.valuesgrouped下面是一段使用reduce的动态代码。首先获取唯一键数组,即['0-1s','1-2s',],然后将其转换为对象。然后在arr上使用reduce并向其添加属性 常数arr=[{ “0-1s”:6, “1-2”:2, 国家:美国 }, { “0-1s”:1, “1-2”:4, 国家:ja }, { “0-1s”:3, “1-2”:9, 国家:加利福尼亚 }] const obj=[…new Setarr.mapx=>Object.keysx.filtera=>a.includes'-'.flat].reduceac,a=>ac[a]={time:a},ac,{}; 常数res=arr.reduceac,a=>{ Object.keysa.forEachx=>{ 如果x.包括“-”ac[x][a.国家]=a[x]; } 返回ac; },obj
console.logObject.valuesres下面是一段使用reduce的动态代码。首先获取唯一键数组,即['0-1s','1-2s',],然后将其转换为对象。然后在arr上使用reduce并向其添加属性 常数arr=[{ “0-1s”:6, “1-2”:2, 国家:美国 }, { “0-1s”:1, “1-2”:4, 国家:ja }, { “0-1s”:3, “1-2”:9, 国家:加利福尼亚 }] const obj=[…new Setarr.mapx=>Object.keysx.filtera=>a.includes'-'.flat].reduceac,a=>ac[a]={time:a},ac,{}; 常数res=arr.reduceac,a=>{ Object.keysa.forEachx=>{ 如果x.包括“-”ac[x][a.国家]=a[x]; } 返回ac; },obj
console.logObject.valuesres您可以通过模块化的方式尝试这种重用性概念 我使用了数组上定义的map方法来创建新数组 注意:您可以定义键来停止不必要的迭代,或者如果您的数组很大,并且大多数键都匹配,那么就没有问题了
您可以以模块化的方式尝试这样做,以实现可重用性的概念 我使用了数组上定义的map方法来创建新数组 注意:您可以定义键来停止不必要的迭代,或者如果您的数组很大,并且大多数键都匹配,那么就没有问题了
哇!我不知道reduce方法。这几乎是完美的!也可以将时间作为事后财产?。如果允许的话,我会把你的回答标为接受me@user3587624忘了吧。此外,还添加了一种获取时间范围属性动态数的方法。这种方法非常有效。我真的很感激。我将继续学习reduce方法。看起来很强大!我非常喜欢你的第二个解决方案。简单、快速、高效。我想了很多,但没能接近你。哇。。。我不知道reduce方法。这几乎是完美的!也可以将时间作为事后财产?。如果允许的话,我会把你的回答标为接受me@user3587624忘了吧。此外,还添加了一种获取时间范围属性动态数的方法。这种方法非常有效。我真的很感激。我将继续学习reduce方法。看起来很强大!我非常喜欢你的第二个解决方案。简单、快速、高效。我想了很多,但没能达到你的目的。
// function 1
function getNewArray(arr) {
let newArr = [];
if(arr.length) {
let keys = ["0-1s", "1-2s"];
newArr = keys.map((key) => {
let newObj = {}
// console.log(newObj, key)
for(let obj of arr) {
if(newObj["time"] === undefined) {
newObj["time"] = key
}
newObj[obj["country"]] =obj[key]
}
return newObj
})
}
return newArr
}
// function 2
function test() {
let arr = [{
"0-1s": 6,
"1-2s": 2,
country: "us"
}, {
"0-1s": 1,
"1-2s": 4,
country: "ja"
}, {
"0-1s": 3,
"1-2s": 9,
country: "ca"
}]
let newArr = getNewArray(arr)
console.log(newArr)
/*
[ { time: '0-1s', us: 6, ja: 1, ca: 3 },
{ time: '1-2s', us: 2, ja: 4, ca: 9 } ]
*/
/* --- Pretty printing --- */
console.log(JSON.stringify(newArr, null, 4))
/*
[
{
"time": "0-1s",
"us": 6,
"ja": 1,
"ca": 3
},
{
"time": "1-2s",
"us": 2,
"ja": 4,
"ca": 9
}
]
*/
}
// Start
test()