如何使用 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);
我想将下面名为 '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);