首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript:合并对象数组

Javascript:合并对象数组
EN

Stack Overflow用户
提问于 2022-06-02 05:08:41
回答 2查看 76关注 0票数 -1

我有一个带有嵌套对象的对象数组,如下所示:

代码语言:javascript
复制
[
  {
    "metric1": 4.1,
    "addons": {
      "call_uuid_1": "13d1e097-0363-4a81-b9e4-85c6a770cdb2",
      "ThisDN_1": "50002",
      "call_uuid": "13d1e097-0363-4a81-b9e4-85c6a770cdb4",
      "ThisDN": "50004"
    }
  },
  {
    "metric2": -12345.123412341234,
    "addons": {
      "call_uuid_2": "13d1e097-0363-4a81-b9e4-85c6a770cdb3",
      "ThisDN_2": "50003",
      "call_uuid": "13d1e097-0363-4a81-b9e4-85c6a770cdb4",
      "ThisDN": "50004"
    }
  },
  {
    "metric3": -2345.123412341234,
    "addons": {
      "call_uuid_1": "13d1e097-0363-4a81-b9e4-85c6a770cdb2",
      "ThisDN_1": "50002",
      "call_uuid": "13d1e097-0363-4a81-b9e4-85c6a770cdb4",
      "ThisDN": "50004"
    }
  },
  {
    "metric4": -345.12341234123414,
    "addons": {
      "call_uuid_2": "13d1e097-0363-4a81-b9e4-85c6a770cdb3",
      "ThisDN_2": "50003",
      "call_uuid": "13d1e097-0363-4a81-b9e4-85c6a770cdb4",
      "ThisDN": "50004"
    }
  }
]

我希望将一些数组对象与相同的嵌套对象addons合并,以便前面的数组变成:

代码语言:javascript
复制
[
  {
    "metric1": 4.1,
    "metric3": -2345.123412341234,
    "addons": {
      "call_uuid_1
": "13d1e097-0363-4a81-b9e4-85c6a770cdb2",
      "ThisDN_1": "50002",
      "call_uuid": "13d1e097-0363-4a81-b9e4-85c6a770cdb4",
      "ThisDN": "50004"
    }
  },
  {
    "metric2": -12345.123412341234,
    "metric4": -345.12341234123414,
    "addons": {
      "call_uuid_2": "13d1e097-0363-4a81-b9e4-85c6a770cdb3",
      "ThisDN_2": "50003",
      "call_uuid": "13d1e097-0363-4a81-b9e4-85c6a770cdb4",
      "ThisDN": "50004"
    }
  }
]

有什么办法可以做到吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-02 05:58:07

如果数组有多个具有相同addons对象的元素,则可以删除第一个元素的addons对象,然后将其与其他元素合并。

代码语言:javascript
复制
for (let i = 0; i < arr.length; i++) {
  for (let j = i + 1; j < arr.length; j++) {
    if (JSON.stringify(arr[i]["addons"]) === JSON.stringify(arr[j]["addons"])) {
      delete arr[i]["addons"];
      Object.assign(arr[i], arr[j]);
      arr.splice(j, 1);
      j -= 1;
    }
  }
}

输出:

代码语言:javascript
复制
[
  {
    metric1: 4.1,
    metric3: -2345.123412341234,
    addons: {
      call_uuid_1: '13d1e097-0363-4a81-b9e4-85c6a770cdb2',
      ThisDN_1: '50002',
      call_uuid: '13d1e097-0363-4a81-b9e4-85c6a770cdb4',
      ThisDN: '50004'
    }
  },
  {
    metric2: -12345.123412341234,
    metric4: -345.12341234123414,
    addons: {
      call_uuid_2: '13d1e097-0363-4a81-b9e4-85c6a770cdb3',
      ThisDN_2: '50003',
      call_uuid: '13d1e097-0363-4a81-b9e4-85c6a770cdb4',
      ThisDN: '50004'
    }
  }
]
票数 1
EN

Stack Overflow用户

发布于 2022-06-02 05:55:24

可以使用JSON.stringifyaddons对象中查找等式,然后合并对象。如下所示:

代码语言:javascript
复制
const array = [
  {
    "metric1": 4.1,
    "addons": {
      "call_uuid_1": "13d1e097-0363-4a81-b9e4-85c6a770cdb2",
      "ThisDN_1": "50002",
      "call_uuid": "13d1e097-0363-4a81-b9e4-85c6a770cdb4",
      "ThisDN": "50004"
    }
  },
  {
    "metric2": -12345.123412341234,
    "addons": {
      "call_uuid_2": "13d1e097-0363-4a81-b9e4-85c6a770cdb3",
      "ThisDN_2": "50003",
      "call_uuid": "13d1e097-0363-4a81-b9e4-85c6a770cdb4",
      "ThisDN": "50004"
    }
  },
  {
    "metric3": -2345.123412341234,
    "addons": {
      "call_uuid_1": "13d1e097-0363-4a81-b9e4-85c6a770cdb2",
      "ThisDN_1": "50002",
      "call_uuid": "13d1e097-0363-4a81-b9e4-85c6a770cdb4",
      "ThisDN": "50004"
    }
  },
  {
    "metric4": -345.12341234123414,
    "addons": {
      "call_uuid_2": "13d1e097-0363-4a81-b9e4-85c6a770cdb3",
      "ThisDN_2": "50003",
      "call_uuid": "13d1e097-0363-4a81-b9e4-85c6a770cdb4",
      "ThisDN": "50004"
    }
  }
];

const mergedArray = [];
const addonsToIndexMap = {};

array.forEach(item => {
 const stringifyAddon = JSON.stringify(item.addons);    
 let indexInTheMap = addonsToIndexMap[stringifyAddon];
 if(indexInTheMap !== undefined) {
   mergedArray[indexInTheMap] = {...mergedArray[indexInTheMap], ...item};
 } else {
   mergedArray.push(item);
   addonsToIndexMap[stringifyAddon] = mergedArray.length - 1;
 }
});
console.log(mergedArray);

addonsToIndexMap的使用只是为了优化目的。注意:这个方法只有在addon对象中的键顺序相同的情况下才能工作。此外,我还更正了程序中的输入,以便使用call_uuid_1更新键call_uuid_1,以获得预期的输出,如注释中所述。请作相应的修改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72470935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档