【问题标题】:Merge objects in an array based on other values根据其他值合并数组中的对象
【发布时间】:2018-04-15 09:36:50
【问题描述】:

我正在尝试根据一系列匹配属性合并数组中的一组字符串,并删除重复的项目。

我当前的数组:

{id: "12", value: "Option 1"},
{id: "55", value: "Option A"},
{id: "55", value: "Option B"},
{id: "55", value: "Option C"},
{id: "55", value: "Option D"},
{id: "106", value: "Option 1"}

我想合并所有 id 为 '55' 的项目,所以我的数组将如下所示:

{id: "12", value: "Option 1"},
{id: "55", value: "Option A, Option B, Option C, Option D"},
{id: "106", value: "Option}

我只能设法使用 for 循环合并前 2 个项目并检查 -1 同级项目,如果我的代码没有严重膨胀,就无法做到这一点。

任何建议将不胜感激。

【问题讨论】:

  • 你能发布你的for循环代码吗?
  • 我几乎使用了 Usman Rana 发布的内容(嵌套 for 循环),但我忘记了条件 i != j 并且出现了违规行为。

标签: javascript arrays json merge


【解决方案1】:

您可以将对象用作查找表,同时将结果并行存储在数组中:

const lookup = {}, result = [];

for( const {id, value} of input ){
  if(lookup[id]){
     lookup[id].value += "," + value;
  }else{
     result.push( lookup[id] = {id, value} );
  }
}

这是相当新的 javascript,但它在现代引擎上 works ;)

【讨论】:

    【解决方案2】:

    可能有点晚了。但是你可以用for/while 循环试试这个。这是一个非常基本的方法。如果时间复杂度不是问题。否则 Jons w 的回答很好。

    var x = [{id: "12", value: "Option 1"},
    {id: "55", value: "Option A"},
    {id: "55", value: "Option B"},
    {id: "55", value: "Option C"},
    {id: "55", value: "Option D"},
    {id: "12", value: "Option D"},
    {id: "53", value: "Option D"},
    {id: "106", value: "Option 1"}];
    
    for(var j =0; j<x.length;j++){
    for(var i =0; i<x.length;i++){
      if(x[j].id == x[i].id && i !=j){
         x[j].value = x[j].value + "," +x[i].value;
         x.splice(i, 1);
         }
      }
    }
    console.log(x);

    【讨论】:

    • 感谢 Usman,我正在尝试嵌套在 for 循环中的 for 循环,但忘记了 i != j 并且遇到了问题。我接受了最佳答案,因为它是一个相当小的 sn-p 代码,但这是我最初想要的。
    • linting, linting, linting...而且你需要在拼接后减少 i...但是仍然:谢谢 ;)
    【解决方案3】:

    您可以使用array#reduce

    const data = [{id: "12", value: "Option 1"},{id: "55", value: "Option A"},{id: "55", value: "Option B"},{id: "55", value: "Option C"},{id: "55", value: "Option D"},{id: "106", value: "Option 1"}];
    
    var result = data.reduce((r, o) => {
      return r[o.id] = r[o.id] ? (r[o.id].value += ", " + o.value, r[o.id]) : o, r;
    },{})
    
    var output = Object.values(result);
    console.log(output);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      猜你喜欢
      • 2021-08-17
      • 2013-10-08
      • 1970-01-01
      • 2012-12-19
      • 2021-03-21
      • 1970-01-01
      • 1970-01-01
      • 2020-10-14
      • 2022-12-01
      相关资源
      最近更新 更多