#javascript
#javascript
Вопрос:
У меня есть два массива объектов
const oldArr = [
{
assetDetail_ID: 1,
asset_Condition: "",
asset_Condition_ID: 0,
supplier_ID: 5,
},
{
assetDetail_ID: 2,
asset_Condition: "Good",
asset_Condition_ID: 3,
supplier_ID: 10,
},
];
const newArr = [
{
assetDetail_ID: 1,
supplier_ID: 40,
},
{
assetDetail_ID: 2,
supplier_ID: 30,
},
];
Я пытаюсь найти общие значения, сверяясь с object key
, и если они совпадают, получить пару ключей и значений в новый массив, чтобы мой конечный результат был
expectedResult = [
{
assetDetail_ID: 1,
supplier_ID: 5,
},
{
assetDetail_ID: 2,
supplier_ID: 10,
},
];
Я пробовал это, но я получаю только значения, [1, 5, 2, 10]
а не объекты, что я здесь делаю не так?
const oldArr = [{
assetDetail_ID: 1,
asset_Condition: "",
asset_Condition_ID: 0,
supplier_ID: 5,
},
{
assetDetail_ID: 2,
asset_Condition: "Good",
asset_Condition_ID: 3,
supplier_ID: 10,
},
];
const newArr = [{
assetDetail_ID: 1,
supplier_ID: 40,
},
{
assetDetail_ID: 2,
supplier_ID: 30,
},
];
const arr = []
oldArr.forEach((one, x) => {
for (let i in one) {
for (let j in newArr[x])
if (i === j) {
arr.push(one[i]); // If I change to arr.push(one);, it adds the whole object
}
}
});
console.log(arr)
Комментарии:
1. Не используйте for..in когда вы перебираете массивы. Используйте forEach или map или reduce
Ответ №1:
если вы хотите сделать это по-своему,
const oldArr = [{
assetDetail_ID: 1,
asset_Condition: "",
asset_Condition_ID: 0,
supplier_ID: 5,
},
{
assetDetail_ID: 2,
asset_Condition: "Good",
asset_Condition_ID: 3,
supplier_ID: 10,
},
];
const newArr = [{
assetDetail_ID: 1,
supplier_ID: 40,
},
{
assetDetail_ID: 2,
supplier_ID: 30,
},
];
const arr = oldArr.map((one, index) => {
const existingKeys = Object.keys(newArr[index]).filter(key => one.hasOwnProperty(key));
let newObj = existingKeys.reduce((acc, curr) => {
acc[curr] = one[curr];
return acc;
}, {});
return newObj;
});
console.log(arr)
Комментарии:
1. Спасибо за комментарий, одна вещь в том, что у меня не всегда есть assetDetail_ID и supplier_ID
newArr
, иногда он может иметь больше значений, таких какasset_Condition
илиasset_Condition_ID
или даже другие значения, поскольку код, который я публикую здесь, не является полным объектом. Есть ли способ избежать написания этогоarr.push({assetDetail_ID: one.assetDetail_ID, supplier_ID: one.supplier_ID});
и вместо этого автоматически добавлять объекты, которые найдены одинаковыми?2. В этом случае я думаю, что ожидаемый вами результат неверен в соответствии с newArr и oldArr. Если вам нужна только совпадающая пара KeyValue, то откуда там supplier_ID: 5?
3. Я думаю, что моя логика неверна, спасибо за это.
4. Спасибо, это то, что мне было нужно
Ответ №2:
Вы могли бы использовать одноцикловый подход для обоих массивов и собрать все assetDetail_ID
newArr
в объект и получить плоский массив oldArr
, возвращая либо новый объект, либо пустой массив.
const
oldArr = [{ assetDetail_ID: 1, asset_Condition: "", asset_Condition_ID: 0, supplier_ID: 5 }, { assetDetail_ID: 2, asset_Condition: "Good", asset_Condition_ID: 3, supplier_ID: 10 }],
newArr = [{ assetDetail_ID: 1, supplier_ID: 40 }, { assetDetail_ID: 2, supplier_ID: 30 }],
temp = Object.fromEntries(newArr.map(({ assetDetail_ID }) => [assetDetail_ID, true])),
result = oldArr.flatMap(({ assetDetail_ID, supplier_ID }) => temp[assetDetail_ID]
? { assetDetail_ID, supplier_ID }
: []
);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Ответ №3:
function doTheJob(oldArr, newArr){
let result = new Set();
for(let i = 0; i < oldArr.length; i ){
for(let j = 0; j < newArr.length; j ){
if(oldArr[i].assertDetail_ID === newArr[j].assertDetail_ID){
result.add(newArr[j]);
}
}
}
return Array.from(result);
}
Это может решить вашу проблему!
Ответ №4:
Что вам нужно, так это классическая функция массива JavaScript filter()
Вот пример —
//your array
const oldArr = [
{
assetDetail_ID: 1,
asset_Condition: "",
asset_Condition_ID: 0,
supplier_ID: 5,
},
{
assetDetail_ID: 2,
asset_Condition: "Good",
asset_Condition_ID: 3,
supplier_ID: 10,
},
];
Функция —
function getArr(id){
const newArr = oldArr.filter(obj => { return obj.assetDetail_ID === id})
console.log(newArr); //let id = 1; this will give you a sub-array where assetDetail_ID = 1
return newArr;
}