在Javascript中合并2个对象并删除重复项[duplicate]

qoefvg9y  于 2022-12-28  发布在  Java
关注(0)|答案(3)|浏览(212)
    • 此问题在此处已有答案**:

JavaScript - merge two arrays of objects and de-duplicate based on property value(14个答案)
23小时前关门了。
我是JavaScript新手,需要一些帮助来组合2个对象并删除重复项,所以有人能解决这个问题吗?我得到了2个对象,如下所示:

[
       {
        Id: 'car1',
        company: 'bmw',
        mileage: 66
      },
      {
        Id: 'car2',
        company: 'audi',
        mileage: 53
      },
      {
        Id: 'car3',
        company: 'GM',
        mileage: 48
      }  
    ]

以及

[
      {
        Id: 'car1',
        company: 'bmw',
        mileage: 12
      },
      {
        Id: 'car2',
        company: 'audi',
        mileage: 67
      },
      {
        Id: 'car4',
        company: 'Mercedes',
        mileage: 54
      }
    ]

我需要合并这两个对象,以便输出如下所示,其中两个对象合并,如果汽车id相同,则里程数较高的汽车保留:

[
  {
    Id: 'car1',
    company: 'bmw',
    mileage: 66
  },
  {
    Id: 'car2',
    company: 'audi',
    mileage: 67
  },
  {
    Id: 'car3',
    company: 'GM',
    mileage: 48
  }, 
  {
    Id: 'car4',
    company: 'Mercedes',
    mileage: 54
  } 
]
voase2hg

voase2hg1#

我的解决方案:

function mergeArraysWithUniqObjectId(...arrays) {
  return arrays
    .flat()
    .filter(
      (el, idx, self) => self.findIndex((inner) => inner.Id === el.Id) === idx
    )
    .sort((a, b) => a.Id.localeCompare(b.Id));
}

let array1 = [
    {
      Id: "car1",
      company: "bmw",
      mileage: 66,
    },
    {
      Id: "car2",
      company: "audi",
      mileage: 53,
    },
    {
      Id: "car3",
      company: "GM",
      mileage: 48,
    },
  ],
  array2 = [
    {
      Id: "car1",
      company: "bmw",
      mileage: 12,
    },
    {
      Id: "car2",
      company: "audi",
      mileage: 67,
    },
    {
      Id: "car4",
      company: "Mercedes",
      mileage: 54,
    },
  ],
  array3 = [
    {
      Id: "car6",
      company: "bmw",
      mileage: 55,
    },
    {
      Id: "car1",
      company: "audi",
      mileage: 67,
    },
    {
      Id: "car5",
      company: "Mercedes",
      mileage: 51,
    },
  ];

console.log(mergeArraysWithUniqObjectId(array1, array2, array3));
esyap4oy

esyap4oy2#

像这样的东西可能会工作。
1.复制数组
1.迭代其他数组,添加未找到的项,如果里程数更高则替换。

const res = array1.slice()

array2.forEach(it2=> {
 const index = res.findIndex(it=> it.Id === it2.Id)
 if (index === -1){
   res.push(it2)
 } 
 else if (it2.mileage > res[index].mileage) {
   res.splice(index, 1, it2)
 }
})
const array1 = [{
    Id: 'car1',
    company: 'bmw',
    mileage: 66
  },
  {
    Id: 'car2',
    company: 'audi',
    mileage: 53
  },
  {
    Id: 'car3',
    company: 'GM',
    mileage: 48
  }
]

const array2 =  [
  {
    Id: 'car1',
    company: 'bmw',
    mileage: 12
  },
  {
    Id: 'car2',
    company: 'audi',
    mileage: 67
  },
  {
    Id: 'car4',
    company: 'Mercedes',
    mileage: 54
  }
]

const res = array1.slice()

array2.forEach(it2 => {
  const index = res.findIndex(it => it.Id === it2.Id)
  if (index === -1) {
    res.push(it2)
  } else if (it2.mileage > res[index].mileage) {
    res.splice(index, 1, it2)
  }
})

console.log(res)
0tdrvxhp

0tdrvxhp3#

我已经使用concat方法连接了2个数组,然后通过for循环找到了唯一的对象。
这里arr1是第一个对象,arr2是第二个对象。

let newArray = [];

let uniqueObject = {};

for (let i in arr) {
  objId = arr[i]['Id'];
  uniqueObject[objId] = arr[i];
}

for (i in uniqueObject) {
  newArray.push(uniqueObject[i]);
}

console.log(newArray);

检查JSFiddle link

相关问题