我正在尝试操纵此对象的示例数组。
[ { 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] 删除。
我来说两句