基于另一个等长的数组中的值拆分数组 - Javascript

时间:2017-04-20 22:26:01

标签: javascript arrays sub-array

我有两个长度相等的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中该索引处的项目。

我想基于inputLabels中的标签(A,B& C)将inputValues拆分成一个新的数组数组,同时还创建一个新的唯一标签值数组,以便得到:

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。

2 个答案:

答案 0 :(得分:0)



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" ],
    // ...
}

我认为它比你期望的结果更有条理。

答案 1 :(得分:0)

使用Array#map的可能解决方案。

var inputLabels = ["A", "A", "A", "B", "A", "A", "A", "B", "B", "B", "C"],
    inputValues = [5, 4, 6, 0.01, 7, 12, 2, 0.06, 0.02, 0.01, 98.7],
    hash = [...new Set(inputLabels)],
    res = hash.map(v => inputLabels.map((c,i) => c == v ? inputValues[i] : null).filter(z => z));
    
    console.log(JSON.stringify(hash), JSON.stringify(res));