如何使用 javascript 将字典数组更改为表示数组中两个属性组合的子列表列表?

How to change an array of dictionaries into a list of sublists representing a combinations of two attributes in the array using javascript?

我想将下面名为 'data' 的数组更改为下面名为 'result'

的子列表的结果列表
data = [{'name':'abby','fruit':'apple'},{'name':'abby','fruit':'apple'},{'name':'abby','fruit':'banana'},{'name':'bobby','fruit':'apple'},{'name':'chris','fruit':'banana'}]

基于此数据,可以创建以下视觉效果(创建以帮助阐明):

我想将数组表示为子列表列表,其中每个子列表包含三个项目。应该有六个子列表来表示 'name' 和 'fruit' 的每个组合,以及该组合的计数。子列表中的第一项应为人名,第二项应为水果,第三项应为计数:

因此,我想创建以下包含六个项目的列表:

result = [['abby','apple',2],['bobby','apple',1],['chris','apple',0],['abby','banana',1],['bobby','banana',0],['chris','banana',1]]

我目前正在尝试解决的方法如下:

1) 使用 underscore.js

识别 'name' 和 'fruit' 处的唯一值
var names = _.uniq(_.pluck(data,'name')) 
['abby','bobby','chris']

var names = _.uniq(_.pluck(data,'fruit')) 
fruit = ['apple','banana']

2) 创建这两个列表的所有组合,我仍在研究如何在 javascript

中进行操作
[['abby','apple'],['bobby','apple'],['chris','apple'],['abby','banana'],['bobby','banana'],['chris','banana']]

3) 从这个组合列表中,将它在列表中出现的次数相加以产生以下结果(还在尝试弄清楚 javascript 中的操作方法)

[['abby','apple',2],['bobby','apple',1],['chris','apple',0],['abby','banana',1],['bobby','banana',0],['chris','banana',1]]

您可以使用散列 table,然后对找到的水果和名称进行交互,以返回包含值的数组。

(这个答案回答了原来的问题。)

var data = [{ 'name': 'abby', 'fruit': 'apple' }, { 'name': 'abby', 'fruit': 'apple' }, { 'name': 'abby', 'fruit': 'banana' }, { 'name': 'bobby', 'fruit': 'apple' }, { 'name': 'chris', 'fruit': 'banana' }],
    names = {},
    fruits = {},
    hash = Object.create(null),
    result = [];

data.forEach(function (a) {
    fruits[a.fruit] = true;
    names[a.name] = true;
    hash[a.fruit] = hash[a.fruit] || {};
    hash[a.fruit][a.name] = (hash[a.fruit][a.name] || 0) + 1;
});

Object.keys(fruits).forEach(function (f, i) {
    Object.keys(names).forEach(function (n, j) {
        result.push([i, j, hash[f][n] || 0]);
    });
});

console.log(result);

(这用名字和水果回答了实际问题)

var data = [{ 'name': 'abby', 'fruit': 'apple' }, { 'name': 'abby', 'fruit': 'apple' }, { 'name': 'abby', 'fruit': 'banana' }, { 'name': 'bobby', 'fruit': 'apple' }, { 'name': 'chris', 'fruit': 'banana' }],
    names = {},
    fruits = {},
    hash = Object.create(null),
    result = [];

data.forEach(function (a) {
    fruits[a.fruit] = true;
    names[a.name] = true;
    hash[a.fruit] = hash[a.fruit] || {};
    hash[a.fruit][a.name] = (hash[a.fruit][a.name] || 0) + 1;
});

Object.keys(fruits).forEach(function (f) {
    Object.keys(names).forEach(function (n) {
        result.push([n, f, hash[f][n] || 0]);
    });
});

console.log(result);