Я относительно новичок в underscore.js, и у меня есть объект, входящий в сервис REST, который выглядит так (я набрал его вручную и назначил его здесь var) :Underscore.js преобразовать объект в массив
var production = [
{key: ["wind", "1"], value: 5},
{key: ["wind", "2"], value: 9},
{key: ["wind", "3"], value: 11},
{key: ["wind", "4"], value: 7},
{key: ["solar", "1"], value: 1},
{key: ["solar", "2"], value: 1},
{key: ["solar", "3"], value: 2},
{key: ["solar", "4"], value: 3},
{key: ["oil", "1"], value: 15},
{key: ["oil", "2"], value: 16},
{key: ["oil", "3"], value: 22},
{key: ["oil", "4"], value: 23},
];
Потом дальше, у меня есть некоторый код, который разбирает этот объект и создает массивы для элементов, как так:
var orderedProduction = _.chain(production)
.groupBy(function (entity) {
return entity.key[0];
})
.map(function (values) {
return _.map(values, function (entity2) {
return entity2.value;
});
})
.value();
Это дает следующие результаты:
orderedProduction = [
[5, 9, 11, 7],
[1, 1, 2, 3],
[15, 16, 22, 23]
]
Который теряет ключи (ветер/солнце/масло). И используется для рисования графика. Я в дальнейшем иметь возможность проверить, если некоторые из этих массивов отвечают определенный порог, как так:
var threshold = _.map(orderedProduction , function(arr) {
return _.max(arr) > 10;
});
Мои требования теперь изменились, и теперь мне нужно, чтобы отфильтровать эти массивы по своей общей сумме, сохраняя при этом ключе.
То, что я хотел бы в конечном итоге с объектом, как так:
orderedProduction = {
"wind": [5, 9, 11, 7],
"solar": [1, 1, 2, 3],
"oil": [15, 16, 22, 23]
}
Было бы здорово, если исправление включено способ просуммировать значения массива и удалить те, которые не могут составить до до определенной суммы. (т. е. исключить солнечную энергию, если она не составляет до 10).
Вот jsfiddle я создал, чтобы испытать все это на: http://jsfiddle.net/2mfjw3jk/
UPDATE: Решение, которое я довольствовалась был такой:
var orderedProduction = _.chain(production)
.groupBy(function (entity) {
return entity.key[0];
})
.map(function (vals, key) {
return [key, _.pluck(vals, 'value')]
})
.filter(function(arr) {
var sum = 0;
_.each(arr[1], function(num){
sum += num;
})
return sum > 10;
})
.object()
.value();
Он также фильтрует значений при помощи предопределенный порог (в данном случае - 10).
Awesome. Я справился с этим, используя цепочку, pluck, uniq, object. Но это решение настолько аккуратно. Огромное спасибо. – Husman