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

标签 javascript arrays underscore.js combinations sublist

我想将下面名为“data”的数组更改为下面名为“result”的子列表的结果列表

data = [{'name':'abby','fruit':'apple'},{'name':'abby','fruit':'apple'},{'name':'abby','fruit':'banana'},{'name':'bobby','fruit':'apple'},{'name':'chris','fruit':'banana'}]

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

Abby has an apple and banana, bobby just has a apple, chris just has a banana

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

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

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]]

最佳答案

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

(此答案回答了原始问题。)

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);

关于javascript - 如何使用 javascript 将字典数组更改为表示数组中两个属性组合的子列表列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38982530/

相关文章:

javascript - 动态编辑值

c# - 关于c#中数组的初学者问题

javascript - 使用 Underscore.js 检查 undefined variable

javascript - _.extend/_.assign 的目的?

javascript - 动态改变flexslider的itemWidth

javascript - onClick 并不总是触发

javascript - 带有数据更新的 Angular 应用程序中的 Chrome 中的 SVG 闪烁

c - 无法使用 toupper 将值从小写转换为大写

JavaScript:为什么 [object Array] 不能使用 for( i of array) 进行迭代

javascript - Backbone.js中如何使用groupBy对集合进行分组?