我有两个长度相等的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。
答案 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));