如何合并两个数组并对它们的值求和?

有两个数组,我想合并两个数组,并仅在数据名称匹配时对它们求和。否则,如果名称不匹配,则仅合并或推送数组


var demo = {

    "key1": [{"id": 1, "name": "Robbie", "kill": 12 , "knock": 1}, 

                   {"id": 2, "name": "Mohamand", "kill": 12 , "knock": 4},

                   {"id": 3, "name": "Jebisha", "kill": 8 , "knock": 4}],


    "key2": [

                 {"id": 1, "name": "Robbie", "kill":12  , "knock": 4}, 

                 {"id": 2, "name": "Mohamand", "kill": 13 , "knock": 3},

                 {"id":3, "name": "Jebisha", "kill": 5 , "knock": 1},

                 {"id":4, "name": "Alvida", "kill": 8 , "knock": 5}]

};


这是我的脚本文件


var res = demo.key1.map(function(item, idx) {

    return Object.keys(item).reduce(function(obj, key) {

        if (key == 'name') {

            obj[key] = item[key];

        } else {

            obj[key] = item[key] + demo.key2[idx][key];

        }


        return obj;

    }, {});

});

console.log(res);

我的结果是这样的


0:  {id: 1, name: "Robbie", "kill: 24 , knock: 5},

1:  {id: 2, name: "Mohamand","kill: 25 , knock: 7},

2:  {id: 3, name: "Jebisha", "kill: 13 , knock: 5},

我的预期输出是这样的


0:  {id: 1, name: "Robbie", "kill: 24 , knock: 5},

1:  {id: 2, name: "Mohamand","kill: 25 , knock: 7},

2:  {id: 3, name: "Jebisha", "kill: 13 , knock: 5},

3:  {"id":4, "name": "Alvida", "kill": 8 , "knock": 5}


江户川乱折腾
浏览 127回答 5
5回答

HUH函数

您缺少最后一个元素,因为您只迭代第一个数组并在第二个数组中搜索匹配项,但“Alvida”仅存在于第二个数组中。因此,您需要做的是在构建新数组时迭代两个数组。如果新数组中已存在属性,则对值求和,如果不存在则创建它。说明性示例:const results = {};// arrayToInspect is key1, key2Object.keys(demo).forEach(function(arrayToInspect) {  demo[arrayToInspect].forEach(function(element) {    if (results[element.name]) {      results[element.name].kill += element.kill;      results[element.name].knock += element.knock;    }    else {      results[element.name] = element;    }  });});然后,如果您需要它作为数组,您可以这样做:const resultsArray = Object.values(results);

饮歌长啸

Object.keys(demo).reduce检查每个demo键。demo[key].map迭代每个 的数据"key"。如果数据存在 => 对 和 求和kill,knock否则 => 将其相加。给你:Dlet demo = {  "key1": [{      "id": 1,      "name": "Robbie",      "kill": 12,      "knock": 1    },    {      "id": 2,      "name": "Mohamand",      "kill": 12,      "knock": 4    },    {      "id": 3,      "name": "Jebisha",      "kill": 8,      "knock": 4    }  ],  "key2": [{      "id": 1,      "name": "Robbie",      "kill": 12,      "knock": 4    },    {      "id": 2,      "name": "Mohamand",      "kill": 13,      "knock": 3    },    {      "id": 3,      "name": "Jebisha",      "kill": 5,      "knock": 1    },    {      "id": 4,      "name": "Alvida",      "kill": 8,      "knock": 5    }  ]};let ans = [];Object.keys(demo).reduce((acc, key) => {  demo[key].map(data => {    let found = acc.find(d => d.id === data.id);    if (found) {      found.kill += data.kill;      found.knock += data.knock;    } else {      acc.push(data);    }  });  return acc;}, ans);console.log(ans);

慕妹3146593

这个怎么样?使用地图收集数据然后计算总和使用 [key, value] 迭代映射来构建数组var demo = {    "key1": [{            "id": 1,            "name": "Robbie",            "kill": 12,            "knock": 1        },        {            "id": 2,            "name": "Mohamand",            "kill": 12,            "knock": 4        },        {            "id": 3,            "name": "Jebisha",            "kill": 8,            "knock": 4        }    ],    "key2": [{            "id": 1,            "name": "Robbie",            "kill": 12,            "knock": 4        },        {            "id": 2,            "name": "Mohamand",            "kill": 13,            "knock": 3        },        {            "id": 3,            "name": "Jebisha",            "kill": 5,            "knock": 1        },        {            "id": 4,            "name": "Alvida",            "kill": 8,            "knock": 5        }    ]};function merge(demo) {    let map = new Map()    let _calculate = function cal(arr) {        for (const item of arr) {            if (!map.has(item.id)) {                map.set(item.id, {id: item.id, name: item.name, kill: 0, knock: 0})            }            const obj = map.get(item.id);            obj.kill += item.kill            obj.knock += item.knock            map.set(item.id, obj)        }    }    Object.keys(demo).forEach(key => {        _calculate(demo[key])    })        let arr = []    for (const [key, value] of map) {        arr.push(value)    }    return arr;}console.log(merge(demo));

墨色风雨

const demo = {"key1": [{"id": 1, "name": "Robbie", "kill": 12 , "knock": 1},                {"id": 2, "name": "Mohamand", "kill": 12 , "knock": 4},               {"id": 3, "name": "Jebisha", "kill": 8 , "knock": 4}],"key2": [             {"id": 1, "name": "Robbie", "kill":12  , "knock": 4},              {"id": 2, "name": "Mohamand", "kill": 13 , "knock": 3},             {"id":3, "name": "Jebisha", "kill": 5 , "knock": 1},             {"id":4, "name": "Alvida", "kill": 8 , "knock": 5}]};const res = Object.values(demo).reduce((acc, value) => {const currentElements = value;currentElements.forEach((el) => {    if (!acc[el.id]) {        acc[el.id] = el    } else {        acc[el.id] = {            ...acc[el.id],             "kill": acc[el.id]["kill"] + el["kill"],            "knock": acc[el.id]["knock"] + el["knock"],            }    }});return acc;}, {});console.log(res);

HUWWW

你可以试试这个。这里有多少个键并不重要。当您维护一个对象来检查指定对象是否存在时,速度会更快。var demo = {    "key1": [        {"id": 1, "name": "Robbie", "kill": 12 , "knock": 1},         {"id": 2, "name": "Mohamand", "kill": 12 , "knock": 4},        {"id": 3, "name": "Jebisha", "kill": 8 , "knock": 4}    ],    "key2": [      {"id": 1, "name": "Robbie", "kill":12  , "knock": 4},       {"id": 2, "name": "Mohamand", "kill": 13 , "knock": 3},      {"id":3, "name": "Jebisha", "kill": 5 , "knock": 1},      {"id":4, "name": "Alvida", "kill": 8 , "knock": 5}    ]};const res = {};Object.values(demo).forEach(items => items.reduce((acc, curr) => {  if (res[curr.name] !== undefined) {    res[curr.name].kill += curr.kill;    res[curr.name].knock += curr.knock;  } else {    res[curr.name] = curr;  }  return res;}, res));const result = Object.values(res);console.log(result);.as-console-wrapper {min-height: 100%!important; top: 0}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript