ES6 / JavaScript - Как объединить объект по определенному ключу - PullRequest
0 голосов
/ 26 июня 2018

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

enter image description here

enter image description here

То, что я пытаюсь получить, это ...

0: {field: "currency", operator: "IN", values: ["GBP", "USD"]}
1: {field: "amount", operator: "IN", values: ["2", "3"]}
2: {field: "id", operator: "IN", values: ["12", "15"]}

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Звучит так, будто вы хотите объединить концепции объединения объектов и объединения массивов по пути.

Использование vanilla ES6 (вероятно, далеко не оптимальное с точки зрения производительности):

const one = {field: "currency", values: ["USD"]};
const two = {field: "currency", values: ["GBP"]};

const mergeConcat = (obj1, obj2) => {
  const result = {...obj1, ...obj2};
  Object.keys(obj1).map(key => {
    if (Object.keys(obj2).includes(key) && Array.isArray(obj1[key])) {
      result[key] = obj1[key].concat(obj2[key]);
    }
  })
  return result;
}

console.log(mergeConcat(one, two))
// { field: 'currency', values: [ 'USD', 'GBP' ] }

Использование lodash (почти напрямую из их документов ):

const customizer = (objValue, srcValue) => {
  if (_.isArray(objValue)) {
    return objValue.concat(srcValue);
  }
}

const one = {field: "currency", values: ["USD"]};
const two = {field: "currency", values: ["GBP"]};

console.log(_.mergeWith(one, two, customizer))
// { field: 'currency', values: [ 'USD', 'GBP' ] }
0 голосов
/ 26 июня 2018

Здесь решение с использованием lodash и функции uniqWith: JSFiddle .

Вот код:

function merge(array) {
  return _.uniqWith(array, compareAndMerge)
}

function compareAndMerge(first, second) {
    if (first.field === second.field) {
        first.values = second.values = [].concat(first.values, second.values)
        return true
    }
    return false
}


var data = [{
  field: 'Currency',
  operator: 'IN',
  values: ['usd']
}, {
  field: 'Currency',
  operator: 'IN',
  values: ['gbp']
}, {
  field: 'Amount',
  operator: 'IN',
  values: [2]
},
{
  field: 'Amount',
  operator: 'IN',
  values: [3]
}]

console.log(merge(data))

Функция Lodash.uniqWidth хочет массив и компаратор. В случае равных полей мы редактируем значения двух сравниваемых элементов, назначая объединение двух массивов значений.

Нечто большее: редактирование объектов внутри компаратора является нарушением, но я думаю, что он может работать безопасно.

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