Невозможно объединить два разных массива в соответствии с именем ключа, используя Javascript - PullRequest
2 голосов
/ 07 мая 2020

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

let arr1 = [
  {
    "_id": "PU2-TEXT BOOK",
    "dispatchcount": 2,
    "totalDispatchValue": 5810,
    "totalDiscountValue": 150
  },
  {
    "_id": "PU2-Mathematics Part - 1 Text Book",
    "dispatchcount": 1,
    "totalDispatchValue": 4131,
    "totalDiscountValue": 150
  },
  {
    "_id": "Boys White & Blue Striped Half Shirt",
    "dispatchcount": 1,
    "totalDispatchValue": 4131,
    "totalDiscountValue": 150
  }
]

let arr2 = [
  {
    "_id": "PU2-TEXT BOOK",
    "pendingcount": 2,
    "totalPendingValue": 14157,
    "totalPendingDiscountValue": 1518
  },
  {
    "_id": "PU2-Accountancy Part - 2 Text Book",
    "pendingcount": 1,
    "totalPendingValue": 9002,
    "totalPendingDiscountValue": 834
  }
]

let arr3 = arr1.map((item, i) => Object.assign({}, item, arr2[i]));

console.log(arr3);

Здесь мне нужно объединить оба arr1 and arr2 в соответствии с ключом _id значение, если найдены какие-либо совпадения, тогда оба объекта объединятся, если не найдены из 2-го массива, тогда исходное значение останется как есть. Мой ожидаемый результат приведен ниже.

Ожидаемый результат ::

[
    {
    "_id": "PU2-TEXT BOOK" ,
    "dispatchcount": 2 ,
    "totalDispatchValue": 5810 ,
    "totalDiscountValue": 150 ,
    "pendingcount": 2 ,
    "totalPendingValue": 14157 ,
    "totalPendingDiscountValue": 1518
    },
    {
    "_id": "PU2-Mathematics Part - 1 Text Book",
    "dispatchcount": 1,
    "totalDispatchValue": 4131,
    "totalDiscountValue": 150,
    "pendingcount": 0 ,
    "totalPendingValue": 0 ,
    "totalPendingDiscountValue": 0
  },
  {
    "_id": "Boys White & Blue Striped Half Shirt",
    "dispatchcount": 1,
    "totalDispatchValue": 4131,
    "totalDiscountValue": 150,
    "pendingcount": 0 ,
    "totalPendingValue": 0 ,
    "totalPendingDiscountValue": 0
  },
  {
    "_id": "PU2-Accountancy Part - 2 Text Book",
    "pendingcount": 1,
    "totalPendingValue": 9002,
    "totalPendingDiscountValue": 834,
    "dispatchcount": 0 ,
    "totalDispatchValue": 0 ,
    "totalDiscountValue": 0 
  }
  ] 

Итак, здесь я хочу объединить два массива объектов в соответствии с ключом _id. Если некоторые из них совпадают, тогда оба объекта объединятся, и если объект из 1-го массива отсутствует во 2-м или наоборот, он также объединится со значением 0 для тех ключей, которых нет.

Ответы [ 3 ]

1 голос
/ 07 мая 2020

Вы можете взять объект для значений по умолчанию и распространить свойства на объект с тем же _id.

var data1 = [{ _id: "PU2-TEXT BOOK", dispatchcount: 2, totalDispatchValue: 5810, totalDiscountValue: 150 }, { _id: "PU2-Mathematics Part - 1 Text Book", dispatchcount: 1, totalDispatchValue: 4131, totalDiscountValue: 150 }, { _id: "Boys White & Blue Striped Half Shirt", dispatchcount: 1, totalDispatchValue: 4131, totalDiscountValue: 150 }],
    data2 = [{ _id: "PU2-TEXT BOOK", pendingcount: 2, totalPendingValue: 14157, totalPendingDiscountValue: 1518 }, { _id: "PU2-Accountancy Part - 2 Text Book", pendingcount: 1, totalPendingValue: 9002, totalPendingDiscountValue: 834 }],
    defaults = { _id: "", dispatchcount: 0, totalDispatchValue: 0, totalDiscountValue: 0, pendingcount: 0, totalPendingValue: 0, totalPendingDiscountValue: 0 },
    result = Object.values([...data1, ...data2].reduce((r, o) => {
        r[o._id] = { ... (r[o._id] || defaults), ...o };
        return r;
    }, {}));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 07 мая 2020

Вы можете объединить массивы arr1 и arr2, а затем reduce поверх него. Найдите соответствующий индекс, если он существует, затем объедините два объекта:

let arr1 = [{"_id":"PU2-TEXT BOOK","dispatchcount":2,"totalDispatchValue":5810,"totalDiscountValue":150},{"_id":"PU2-Mathematics Part - 1 Text Book","dispatchcount":1,"totalDispatchValue":4131,"totalDiscountValue":150},{"_id":"Boys White & Blue Striped Half Shirt","dispatchcount":1,"totalDispatchValue":4131,"totalDiscountValue":150}];

let arr2 = [{"_id":"PU2-TEXT BOOK","pendingcount":2,"totalPendingValue":14157,"totalPendingDiscountValue":1518},{"_id":"PU2-Accountancy Part - 2 Text Book","pendingcount":1,"totalPendingValue":9002,"totalPendingDiscountValue":834}];

const penDef = {"pendingcount":0,"totalPendingValue":0,"totalPendingDiscountValue":0}; 
const disDef = {"dispatchcount":0,"totalDispatchValue":0,"totalDiscountValue":0};

let arr3 = [...arr1, ...arr2].reduce((acc, item, i) => {
  const matchIdx = acc.findIndex(o => o._id === item._id);
  if (matchIdx >= 0) {
    newItem = { ...acc[matchIdx],
      ...item
    };
    acc[matchIdx] = newItem;
  } else {
    mergedItem = i >= arr1.length? { ...item,
      ...disDef
    } : { ...item,
      ...penDef
    };
    acc.push(mergedItem);
  }
  return acc;
}, []);

console.log(arr3);
0 голосов
/ 07 мая 2020

Попробуйте использовать коллекцию Map, чтобы иметь уникальные элементы, а затем просто map их:

let  restProperties = { dispatchcount: 0, totalDispatchValue: 0, totalDiscountValue: 0, 
    pendingcount: 0, totalPendingValue: 0, totalPendingDiscountValue: 0 };
let uniqueArr2 = new Map(arr2.map((s)=>([s._id, s])));
arr1 = arr1.map(({_id, ...rest}) => ({_id, ...restProperties, ...rest, 
   ...uniqueArr2.get(_id) }));
const other = arr2.filter(f => !arr1.some(s=> s._id == f._id)).map(s => 
    ({...restProperties, ...s  }));
console.log([...arr1, ...other]);

Пример:

let arr1 = [
{
  "_id": "PU2-TEXT BOOK",
  "dispatchcount": 2,
  "totalDispatchValue": 5810,
  "totalDiscountValue": 150
},
{
  "_id": "PU2-Mathematics Part - 1 Text Book",
  "dispatchcount": 1,
  "totalDispatchValue": 4131,
  "totalDiscountValue": 150
},
{
  "_id": "Boys White & Blue Striped Half Shirt",
  "dispatchcount": 1,
  "totalDispatchValue": 4131,
  "totalDiscountValue": 150
}
  ]

  let arr2 = [
{
  "_id": "PU2-TEXT BOOK",
  "pendingcount": 2,
  "totalPendingValue": 14157,
  "totalPendingDiscountValue": 1518
},
{
  "_id": "PU2-Accountancy Part - 2 Text Book",
  "pendingcount": 1,
  "totalPendingValue": 9002,
  "totalPendingDiscountValue": 834
}
  ]

let  restProperties = { dispatchcount: 0, totalDispatchValue: 0, totalDiscountValue: 0, pendingcount: 0, totalPendingValue: 0, totalPendingDiscountValue: 0 };
let uniqueArr2 = new Map(arr2.map((s)=>([s._id, s])));
arr1 = arr1.map(({_id, ...rest}) => ({_id, ...restProperties, ...rest, ...uniqueArr2.get(_id) }));
const other = arr2.filter(f => !arr1.some(s=> s._id == f._id)).map(s => ({...restProperties, ...s  }));
console.log([...arr1, ...other]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...