Lodash对象数组的联合

时间:2015-03-28 18:17:28

标签: javascript lodash

我想使用_.union函数创建两个对象数组的并集。 Union仅使用基元数组,因为它使用===来检查两个值是否相等。

我想使用键属性比较对象:具有相同键属性的对象将被视为相等。有没有一种很好的功能方法来实现理想的使用lodash?

6 个答案:

答案 0 :(得分:13)

使用array.concat函数执行此操作的非纯lodash方法,您可以在uniq()上完成此操作:

var objUnion = function(array1, array2, matcher) {
  var concated = array1.concat(array2)
  return _.uniq(concated, false, matcher);
}

另一种方法是使用flatten()uniq()

var union = _.uniq(_.flatten([array1, array2]), matcherFn);

答案 1 :(得分:9)

那么UniqBy之前有两个数组的连接怎么样?

  

_.uniqBy([{'x':1},{'x':2},{'x':1}],'x');

     

结果→[{'x':1},{'x':2}]

答案 2 :(得分:4)

晚会,但_.unionWith做得更好。

var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];

_.unionWith(objects, others, _.isEqual);
// => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]

答案 3 :(得分:1)

_.unionBy(array1, array2, matcherFn);

答案 4 :(得分:1)

lodash从数组中合并对象

const test1 = [
  { name: 'zhanghong', age: 32, money: 0, size: 12, },
  { name: 'wanghong', age: 20, size: 6 },
  { name: 'jinhong', age: 16, height: 172 },
]

const test2 = [
  { name: 'zhanghong', gender: 'male', age: 14 },
  { name: 'wanghong', gender: 'female', age: 33 },
  { name: 'lihong', gender: 'female', age: 33 },
]

const test3 = [
  { name: 'meinv' },
]

const test4 = [
  { name: 'aaa' },
]

const test5 = [
  { name: 'zhanghong', age: 'wtf' },
]

const result = mergeUnionByKey(test1, test2, test3, test4, [], test5, 'name', 'override')

function mergeUnionByKey(...args) {

  const config = _.chain(args)
    .filter(_.isString)
    .value()

  const key = _.get(config, '[0]')

  const strategy = _.get(config, '[1]') === 'override' ? _.merge : _.defaultsDeep

  if (!_.isString(key))
    throw new Error('missing key')

  const datasets = _.chain(args)
    .reject(_.isEmpty)
    .filter(_.isArray)
    .value()

  const datasetsIndex = _.mapValues(datasets, dataset => _.keyBy(dataset, key))

  const uniqKeys = _.chain(datasets)
    .flatten()
    .map(key)
    .uniq()
    .value()

  return _.chain(uniqKeys)
    .map(val => {
      const data = {}
      _.each(datasetsIndex, dataset => strategy(data, dataset[val]))
      return data
    })
    .filter(key)
    .value()

}

console.log(JSON.stringify(result, null, 4))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

答案 5 :(得分:0)

  1. 使用键属性比较对象:-
  

_。unionBy(array1,array2,'propname');

  1. 使用所有关键属性比较对象:-
  

_。unionWith(array1,array2,_.isEqual);

  1. 使用不区分大小写的字符串键属性比较对象:-
  

_。unionWith(array1,array2,function(obj,other){返回obj.propname.toLowercase()=== other.propname.toLowercase();});

属性名称是对象的键属性的名称。