Найти общие значения между двумя массивами объектов и сохранить как массив объектов

#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;
}