2016-08-16 1 views
1

Я хотел бы изменить ниже массив с именем «данные» в результирующий список подсписков ниже «результат» по имениКак изменить массив словарей в список подсписок, представляющих комбинации двух атрибутов в массиве с помощью javascript?

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

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

Ну, конечная цель состоит в том, чтобы получить желаемый результат, поданный в высокие диаграммы (http://www.highcharts.com/docs/chart-and-series-types/heatmap), чтобы создать этот вид выше, но я могу удалить так как это не связано напрямую. – Chris

+0

Ну, вы написали какой-нибудь код для любого из этих шагов? Я думаю, что это действительно должно быть разбито на три (или четыре) вопроса в противном случае (четвертое - это как показать это в высоких диаграммах). Кроме того, вы захотите показать, что вы пробовали. Прямо сейчас, похоже, вы просите SO добровольцев сделать эту работу за вас ... –

+0

@MikeMcCaughan Я только изложил шаги, которые я пытаюсь сделать выше, и написал код для первого шага, m с трудностью выполнения даже второго шага, поэтому код кода не был написан после первого шага. Я принял ваш совет и написал этот второй шаг здесь (я могу удалить этот вопрос, если это необходимо): http://stackoverflow.com/questions/38983161/how-to-create-all-combinations-of-two-lists- с помощью поддерживающей JavaScript.Я также не уверен, что мой метод выше - лучший способ разобраться в этом. – Chris

ответ

2

Вы можете использовать хэш-таблицу, а затем interate над найденными фруктами и именами для возвращения массива со значениями.

(Этот ответ дает ответ на исходный вопрос.)

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

Смежные вопросы