Как я могу выполнить поиск дублированных объектов в массиве to?

#javascript #vue.js #ecmascript-6 #vuejs2

#javascript #vue.js #ecmascript-6 #vuejs2

Вопрос:

у меня есть массив, подобный этой структуре, и я хочу выдвинуть несколько неповторяющихся объектов

 [
 {
   applicationNumber: "2",
   id: "8cca5572-7dba-49de-971b-c81f77f221de",
   country: 23,
   totalPrice: 36
 },
 {
   applicationNumber: "3",
   id: "8cca5572-33333-49de-971b-c81f77f221de",
   country: 1,
   totalPrice: 2
 }
]  

я хочу выполнить поиск в этом массиве, прежде чем вводить в него какой-либо другой объект, чтобы проверить существующий объект, и после этого, если никакого существующего объекта нет, ввести новый объект или, если существующий, обновить только этот объект. как я могу это сделать?

Комментарии:

1. Считаете ли вы дублирование точным совпадением, я имею в виду, по всем атрибутам? Или только одно из свойств?

2. @manuman94 нет проверки только с идентификаторами объектов

Ответ №1:

Попробуйте создать вызываемую функцию addToArray , которая принимает исходный массив и новый объект для добавления в качестве параметров, внутри нее найдите индекс того объекта, который уже существует, переопределите его, иначе вставьте его в конец :

 let arr = [{
    id: 1,
    country: 45
  },
  {
    id: 2,
    country: 23
  },
  {
    id: 3,
    country: 75
  },
  {
    id: 4,
    country: 39
  }

]

function addToArray(ar, val) {
  let index = ar.findIndex(item => item.id === val.id);
   (index >= 0) ? ar[index] = val:ar.push(val)
}

console.log('before :',arr)

addToArray(arr, {
  id: 2,
  country: 86
})

console.log('after : ',arr)  

Ответ №2:

Вы могли бы использовать функцию ES6 Array.findIndex() . Вот так:

 let sampleArray = [
 {
   applicationNumber: "2",
   id: "8cca5572-7dba-49de-971b-c81f77f221de",
   country: 23,
   totalPrice: 36
 },
 {
   applicationNumber: "3",
   id: "8cca5572-33333-49de-971b-c81f77f221de",
   country: 1,
   totalPrice: 2,
 }
];

const updateArr = newData =>
{
   const existingIndex = sampleArray.findIndex(obj => obj.id === newData.id);
   if (existingIndex >= 0)
      sampleArray[existingIndex] = { ...sampleArray[existingIndex], ...newData };
   else
      sampleArray.push(newData)
}

const newData = { id: "8cca5572-33333-49de-971b-c81f77f221de", country: 67637674634 }
updateArr(newData);
console.log(sampleArray)  

Ответ №3:

я использую событие для запуска функции при каждом изменении и после этого использую цикл, как показано ниже

 vents.$on('newArr', (newArray) => {
            let i;
            for (i = 0; i < this.exportData.length; i  ) {
                let obj = this.exportData[i];
                if (obj.id === newArray.id) {
                    delete this.exportData[i];
                }
            }
            this.exportData.push(newArray);
        });
  

я думаю, что это просто и понятно, также, если кто-то считает, что этот способ не оптимизирован или не хорош, скажите мне об этом.