使用lodash合并对象并置值

法弗罗(R. Favero)

我正在尝试操纵此对象的示例数组。

[ { name: 'John Wilson',
    id: 123,
    classes: ['java', 'c++']},
  { name: 'John Wilson',
    id: 123,
    classes: 'uml'},
   { name: 'Jane Smith',
    id: 321,
    classes: 'c++'} ]

我需要做的是合并具有相同“ id”的对象,并串联“ classs”并保留一个“ name”。

结果应为:

[ { name: 'John Wilson',
    id: 123,
    classes: ['java', 'c++', 'uml']},
   { name: 'Jane Smith',
    id: 321,
    classes: 'c++'} ]

我尝试使用.merge,但是它没有连接“类”中的值,它只是保留了最后一个相等对象中的值。

使用lodash最简单的方法是什么?

回旋

您正在寻找的功能是_.uniqWith,有一个特殊的变化,我将在稍后解释。

_.uniqWith_.uniq很像,它生成一个唯一的数组,但是它允许您传递自己的自定义比较器函数,该函数将被调用以确定什么算作“相等”。

Sane程序员会理解,该比较器应该没有副作用。这段代码的工作方式是打破该规则,并使用一个比较函数,该函数在幕后产生额外的魔力。但是,这将导致代码非常简洁,无论您的数组中有多少这些对象都可以使用,因此我觉得违规行为是合理的。

我命名比较器函数compareAndMerge是为了不掩盖其不纯净的本性。它将合并两个classes数组并更新两个对象的相关属性,但前提是它们的id值相同。

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

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


var people = [{
  name: 'John Wilson',
  id: 123,
  classes: ['java', 'c++']
}, {
  name: 'John Wilson',
  id: 123,
  classes: 'uml'
}, {
  name: 'Jane Smith',
  id: 321,
  classes: 'c++'
}]

console.log(merge(people))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.min.js"></script>

旁白:您在原始classes列表周围缺少方括号我确保上面的代码不在乎该classes属性是否保存单个字符串或字符串数​​组,以防万一。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章