列出具有单独键位置的不同阵列的匹配值

时间:2015-02-02 05:51:25

标签: underscore.js

鉴于以下数据,我将如何找到多个人喜欢的东西,输出为:

{  喜欢:'香蕉',  likesBy:['person1','person2'] }

var data = [
  {
    name: 'person1',
    likes: ['bananas', 'apples']
  },
  {
    name: 'person2',
    likes' ['grapes', 'bananas']
  }
]

如果有人能指出我正确的方向,会很棒。

干杯

3 个答案:

答案 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')
    }
});