Разделить массив на основе значений в другом массиве равной длины – Javascript

У меня есть два массива Javascript одинаковой длины со следующей структурой:

var inputLabels = ["A", "A", "A", "B", "A", "A", "A", "B", "B", "B", "C"];
var inputValues = [5, 4, 6, 0.01, 7, 12, 2, 0.06, 0.02, 0.01, 98.7];

Элементы в inputValues ​​соответствуют элементу с этим индексом в inputLabels.

Я хочу разделить inputValues ​​​​на новый массив массивов на основе меток (A, B и C) в inputLabels, а также создать новый массив уникальных значений меток, чтобы я получил:

var splitLabels = ["A", "B", "C"];
var splitData = [
                [5, 4, 6, 7, 12, 2],
                [0.01, 0.06, 0.02, 0.01],
                [98.7]
                ];

где индекс каждого элемента в splitLabels соответствует правильному подмассиву в splitValues.

В идеале решение должно быть общим, так что inputLabels может иметь более трех уникальных значений (например, «A», «B», «C», «D», «E») и, следовательно, может привести к более чем трем подмассивам в splitValues.


person trustmeimastomach    schedule 20.04.2017    source источник


Ответы (1)


function groupData(labels, values) {
  return labels.reduce(function(hash, lab, i) { // for each label lab
    if(hash[lab])                               // if there is an array for the values of this label
      hash[lab].push(values[i]);                // push the according value into that array
    else                                        // if there isn't an array for it
      hash[lab] = [ values[i] ];                // then create one that initially contains the according value
    return hash;
  }, {});
}

var inputLabels = ["A", "A", "A", "B", "A", "A", "A", "B", "B", "B", "C"];
var inputValues = [5, 4, 6, 0.01, 7, 12, 2, 0.06, 0.02, 0.01, 98.7];

console.log(groupData(inputLabels, inputValues));

Функция groupData вернет объект в таком формате:

{
    "Label1": [ values of "Label1" ],
    "Label2": [ values of "Label2" ],
    // ...
}

который, я думаю, намного организованнее, чем желаемый результат.

person ibrahim mahrir    schedule 20.04.2017