【问题标题】:ES6 / JavaScript - How to merge an object on a specific keyES6 / JavaScript - 如何在特定键上合并对象
【发布时间】:2018-12-05 08:28:38
【问题描述】:

我正在尝试在特定键(字段是键)上合并对象,但似乎找不到方法。图片将更好地说明我的问题。

我想要得到的是这个......

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

【问题讨论】:

标签: javascript arrays reactjs ecmascript-6


【解决方案1】:

这里使用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 函数需要一个数组和一个比较器。在相等字段的情况下,我们编辑两个比较元素的值,分配两个值数组的串联。

还有一点:在比较器内编辑对象是一种违法行为,但我认为它可以安全运行。

【讨论】:

  • 嗨,伙计,这几乎为我解决了这个问题,但它只适用于两个值。如果我有超过 3 种货币怎么办?
  • @Dally 你在考虑这种可能性吗:jsfiddle.net/r4ewdmt9?它似乎工作
  • Fiddle 似乎对我不起作用,伙计。我启用了 lodash。
  • 你检查浏览器控制台了吗?这是它打印的内容: [{"field":"Currency","operator":"IN","values":["abc","gbp","usd"]},{"field":"Amount ","运算符":"IN","值":[3,2]}]
【解决方案2】:

听起来您正在寻求结合合并对象和串联数组的概念。

使用原生 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(几乎直接来自their docs):

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' ] }

【讨论】:

    猜你喜欢
    • 2012-11-30
    • 1970-01-01
    • 2018-01-02
    • 2021-07-07
    • 2018-04-06
    • 2018-05-27
    • 2018-07-25
    • 2021-08-20
    • 2022-07-21
    相关资源
    最近更新 更多