Ter*_*rry 10 javascript arrays lodash
我现在花了几个小时在Lo-Dash文档站点上,找不到我的问题的解决方案.我不知道它是如何调用的,因此搜索起来有点困难.我基本上想要将数组分组到一个对象中,以便重复的条目是一个字段,而不同的条目是一个数组.
例如,我有这个数组:
var characters = [
{ 'name': 'barney', 'age': 42, 'pet': 'dog' },
{ 'name': 'fred', 'age': 35, 'pet': 'dog' },
{ 'name': 'barney', 'age': 42, 'pet': 'cat' },
{ 'name': 'fred', 'age': 35, 'pet': 'goldfish' }
];
Run Code Online (Sandbox Code Playgroud)
我希望得到这个:
[
{ name: 'barney',
age: 42,
pet: [ 'dog', 'cat' ] },
{ name: 'fred',
age: 35,
pet: [ 'dog', 'goldfish' ] }
]
Run Code Online (Sandbox Code Playgroud)
有没有一个Lo-Dash方法来做这个,还是我必须链接几个?实现这一目标的最佳方法是什么?
虽然回答了,还是一试.的jsfiddle
var characters = [
{ 'name': 'barney', 'age': 42, 'pet': 'dog' },
{ 'name': 'fred', 'age': 35, 'pet': 'dog' },
{ 'name': 'barney', 'age': 42, 'pet': 'cat' },
{ 'name': 'fred', 'age': 35, 'pet': 'goldfish' }
];
var result=_.chain(characters).groupBy("name").map(function(v, i) {
return {
name: i,
age: _.get(_.find(v, 'age'), 'age'),
pet: _.map(v, 'pet')
}
}).value();
document.body.innerHTML = '<pre>' + JSON.stringify(result, null, ' ') + '</pre>';
Run Code Online (Sandbox Code Playgroud)
这是一种更简单的下划线方式:
var result = _.reduce(characters, function (prev, current) {
var char = _.find(prev, function (character) {
return character['name'] === current['name'];
});
// Character does not yet exists in the array, push it
if (char === undefined) {
prev.push(current);
} else {
// If char['pet'] is not an array, create one
if (!_.isArray(char['pet'])) {
char['pet'] = [char['pet']];
}
// Push the current pets to the founded character
char['pet'].push(current['pet']);
}
return prev;
}, []); // Initialize an empty array for the prev object
console.log(result);
Run Code Online (Sandbox Code Playgroud)
让我知道 underscore/lodash 是否有更棒的功能:-)!
| 归档时间: |
|
| 查看次数: |
7874 次 |
| 最近记录: |