鉴于以下数据,我将如何找到多个人喜欢的东西,输出为:
{ 喜欢:'香蕉', likesBy:['person1','person2'] }
var data = [
{
name: 'person1',
likes: ['bananas', 'apples']
},
{
name: 'person2',
likes' ['grapes', 'bananas']
}
]
如果有人能指出我正确的方向,会很棒。
干杯
答案 0 :(得分:1)
您可以遍历数据并创建一个散列图,其中likes
个项目作为键,而names
数组作为值。
count = {}
for (var i = 0; i < data.length; i++) {
for(var j = 0; j < data['likes'].length; j++){
var key = data[i]['likes'][j]
if(!(key in count)){
count[key] = []
}
count[key].push(data[i]['name'])
}
}
示例输出是这样的:
{'bananas':['person1', 'person2'], 'apples':['person1'], 'grapes':['person2']}
答案 1 :(得分:1)
我会使用外部变量和嵌套的foreach循环,确保有更有效的方法,但这是相当简洁和易于阅读
var likes = {};
_.each(data,function(person){
_.each(person.likes,function(like){
if(!likes[like])
likes[like]=[];
likes[ like ].push( person.name );
})
}
然后,您可以过滤掉没有多个元素的值
likes = _.filter(likes,function(value,name){ return value.length > 1; });
会给你
{ 'bananas':['person1','person2'] }
如果你提供了
答案 2 :(得分:1)
这个解决方案使用了更多的下划线而不是你可以动摇一根棍子,但效率不如普通的旧javascript答案。
// get a list of all the fruits
var fruits = _.chain(data)
.pluck('likes')
.flatten()
.uniq()
.value();
var results = _.map(fruits, function(fruit){
var peopleWhoLikeThisFruit = _.filter(data, function(person){
return _.contains(person.likes, fruit);
});
return {
liked: fruit,
likes: _.pluck(peopleWhoLikeThisFruit, 'name')
}
});