#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);
});
я думаю, что это просто и понятно, также, если кто-то считает, что этот способ не оптимизирован или не хорош, скажите мне об этом.