我现在花了几个小时在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' }
];
我希望得到这个:
[
{ name: 'barney',
age: 42,
pet: [ 'dog', 'cat' ] },
{ name: 'fred',
age: 35,
pet: [ 'dog', 'goldfish' ] }
]
这样做是否有Lo-Dash方法,还是我必须链接几个?实现这一目标的最佳方法是什么?
答案 0 :(得分:6)
虽然回答了,但还是试一试。 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>';
答案 1 :(得分:4)
这是一种更为简洁,强硬的方式:
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);
让我知道下划线/ lodash中是否有更强大的功能:-)!
答案 2 :(得分:0)
我得到了一些工作,但我还没有使用过Lo-Dash。所以也可以有更好的解决方案。
var regroupCharacters = function (characters) {
var regrouped = [];
for (var i = 0; i < characters.length; i++) { //get one character
var matched = false;
for (var j = 0; j < regrouped.length; j++) {
if(characters[i].name == regrouped[j].name){ // check in each regrouped element if character is there just add the pet
matched = true;
regrouped[j].pets.push(characters[i].pet);
}
};
if(!matched){ // if it is a new character
var newCharacter = {'name':characters[i].name,'age':characters[i].age,pets:[characters[i].pet]};
regrouped.push(newCharacter);
}
};
return regrouped;
}
调用该函数: -
var regrouped = regroupCharacters(characters);
我使用pets
作为字段而不是pet
,因为它是一个集合,如果您有任何问题,可以更改它。