Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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:如何从另一个数组中创建具有“x”个属性的数组?_Javascript_Arrays - Fatal编程技术网

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