Как объединить два массива объектов на основе атрибута объекта OrderNo?- JavaScript - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть 2 массива объектов

var arrayObj1 = [
  {
   "Plant": "Boston",
   "OrderNo": "406643",
   "Qty1": "56.1650",
   "OrderDate": null,
   "Status": null
  }
 ];

var arrayObj2 = [
  {
    "Plant": "Boston",
    "OrderNo": "406643",
    "Qty2": "22.07",
     "OrderDate": "28/11/2018",
     "Status": null
   },
   {
     "Plant": "Boston",
      "OrderNo": "526209",
      "Qty2": "21.84",
      "OrderDate": "01/03/2019",
       "Status": null
     },
     {
       "Plant": "Boston",
        "OrderNo": "526209",
        "Qty2": "65.46",
        "OrderDate": "01/03/2019",
        "Status": null
      }
    ];

Мой параметр сравнения - OrderNo, если номер заказа одинаков, тогда у этого объекта есть и конечное Qty1, и Qty2.

Предположим, в первом массивеобъект Qty1 существует (больше 0), но для соответствующего OrderNo Qty2 не существует во 2-м массиве объекта, тогда Qty2 должен быть 0 во вновь созданном 3-м массиве объекта.Так же для orderNo, если Qty2 существует (больше 0) во 2-м массиве объекта, но для соответствующего OrderNo Qty1 не существует в 1-м массиве объекта, тогда Qty2 должен быть 0 во вновь созданном 3-м массиве объекта.Также мы должны учитывать, что любой из двух массивов объектов может полностью пустой массив.

Я хочу создать новый массив объектов, подобный этому

var arrayObj3 = [
  {
    "Plant": "Boston",
    "OrderNo": "406643",
    "Qty1": "56.1650",// both Qty1 and Qty2 more than since both exists
    "Qty2": "22.07",// for the OrderNo 406643
     "OrderDate": "28/11/2018",
     "Status": null
   },
   {
     "Plant": "Boston",
      "OrderNo": "526209",
     "Qty1": "0",// Qty1 is 0 as it does not exist for OrderNo 526209
      "Qty2": "21.84",
      "OrderDate": "01/03/2019",
       "Status": null
     },
     {
       "Plant": "Boston",
        "OrderNo": "526209",
        "Qty1": "0",// Qty1 is 0 as it does not exist for OrderNo 526209
        "Qty2": "65.46",
        "OrderDate": "01/03/2019",
        "Status": null
      }
    ];

Как мне легко достичьмой желаемый массив объекта т.е.arrayObj3.Может кто-нибудь предложить мне решение в Vanilla JS (без JQuery и Lodash)?

Некоторые люди неправильно понимают логику.В первом массиве объекта Qty1 существует (больше 0), но для соответствующего OrderNo Qty2 не существует во 2-м массиве объекта, тогда Qty2 должен быть 0 во вновь созданном 3-м массиве объекта.Так же для orderNo, если Qty2 существует (больше 0) во 2-м массиве объекта, но для соответствующего OrderNo Qty1 не существует в 1-м массиве объекта, тогда Qty2 должен быть 0 во вновь созданном 3-м массиве объекта.Также мы должны учитывать, что любой из двух массивов объектов может полностью пустой массив.

Ответы [ 3 ]

0 голосов
/ 16 апреля 2019

Поправь меня, если я ошибаюсь. В основном qty1 для любого заказа должен быть из первого массива и qty2 из второго массива. По этой логике решение:

function mergeObjects (arr1, arr2, localKey, remoteKey) {
  
  return arr1.map(item => {
    var retObj = {...item};
    var ind = arr2.findIndex(x => item.OrderNo === x.OrderNo);
    var order = arr2[ind];
    if (order && parseFloat(retObj[localKey]) > 0 && order[remoteKey]) {
      arr2.splice(ind, 1);
      retObj[remoteKey] = order[remoteKey];
    }
    retObj[remoteKey] = retObj[remoteKey] || 0;
    return retObj;
  })
}

function createArray (arr1, arr2) {
  return [
    ...mergeObjects(arr1, arr2, 'Qty1', 'Qty2'),
    ...mergeObjects(arr2, arr1, 'Qty2', 'Qty1'),
  ]
}

var arrayObj1 = [
  {
    "Plant": "Boston",
    "OrderNo": "406643",
    "Qty1": "56.1650",
    "OrderDate": null,
    "Status": null
  }
];

var arrayObj2 = [
  {
    "Plant": "Boston",
    "OrderNo": "406643",
    "Qty2": "22.07",
    "OrderDate": "28/11/2018",
    "Status": null
  },
  {
    "Plant": "Boston",
    "OrderNo": "526209",
    "Qty2": "21.84",
    "OrderDate": "01/03/2019",
    "Status": null
  },
  {
    "Plant": "Boston",
    "OrderNo": "526209",
    "Qty2": "65.46",
    "OrderDate": "01/03/2019",
    "Status": null
  }
];
console.log(createArray(arrayObj1, arrayObj2))
0 голосов
/ 16 апреля 2019

Вы можете использовать это простое решение, оно использует Object.assign для создания копии с одного объекта на другой объект. Здесь temp obj используется для заполнителя, таким образом, не затрагивая исходные объекты.

//Merged List
var mergedList = new Array();
//For each item in array2
arrayObj2.forEach(function(item){
//filter by orderNo with array1
    arrayObj1.filter(function(item2){
        if(item2.OrderNo===item.OrderNo){
            let temp ={};
            Object.assign(temp,item,item2);
            mergedList.push(temp);
        }else{
            if(!item.hasOwnProperty('Qty1')){
                let temp ={};
                Object.assign(temp,item);
                temp["Qty1"] = "";
                mergedList.push(temp);
            }
           if(!item.hasOwnProperty('Qty2')){
                let temp ={};
                Object.assign(temp,item);
                temp["Qty2"] = "";
                mergedList.push(temp);
            }
        }
    });
});

JS Fiddle https://jsfiddle.net/ejqn8c6b/1/

0 голосов
/ 16 апреля 2019

Вы можете использовать карту:

// create a map
var setObj = {};

// add the items from the first array
arrayObj1.forEach((item) => { setObj[item.OrderNo] = item; });

// add (or merge) the items from the second array
arrayObj2.forEach((item) => { 
    if (setObj[item.OrderNo]) {
        setObj[item.OrderNo].Qty2 = item.Qty2;
    } else {
        setObj[item.OrderNo] = item;
    }
});

// extract the resulting array from the set
var arrayObj3 = Object.values(setObj);

Вместо того, чтобы использовать простой объект JS {} в качестве карты в первой строке, вы также можете использовать JS Map:

var setObj = new Map();

Это имеет лучшую производительность, если у вас много данных.Вам нужно использовать get() и set() с Map .

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...