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

List matching values of different arrays with separate key location

鉴于以下数据,我将如何找到不止一个人喜欢的输出为:

{ 喜欢:'bananas', 喜欢的人:['person1', 'person2'] }

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

如果有人能指出正确的方向,那就太好了。

干杯

您可以遍历数据并创建一个哈希图,其中 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']}

我会使用外部变量和嵌套的 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'] }

在您提供的情况下

此解决方案使用的下划线比您摇摇晃晃的多,但效率不如普通的旧 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')
    }
});