cw8*_*w84 7 javascript ecmascript-5 lodash
我有一组看起来类似的数据:
[
"L1-1_L1.0-1_L1.0.0-1",
"L1-1_L1.0-2_L1.0.0-1",
"L1-1_L1.0-2_L1.0.0-2",
"L1-2_L1.0-1_L1.0.0-1",
"L1-2_L1.0-1_L1.0.0-2",
"L1-3_L1.0-1_L1.0.0-3"
];
Run Code Online (Sandbox Code Playgroud)
我需要找到一种方法来获得每个字符串的可引用分层计数.
例如,
有多少L1-1选择?3
在L1-1中,有多少是L1.0-2选择?2
在L1-1 => L1.0-2中,有多少是L1.0.0-1选择?1
L1-1 => L1.0-2,有多少是L1.0.0-2选择?1
L1-2选择了多少?2
...等
我怀疑我需要以某种方式创建某种可引用的数组桶来管理计数,但我似乎无法掌握数据结构的样子.
我应该如何获得我需要的结果?
我正在使用Es5和lodash库.
您可以将该函数reduce与该函数一起使用forEach来对每个令牌进行计数。
这种方法生成一个对象如下:
{
"L1-1": 3,
"L1-1_L1.0-1": 1,
"L1-3_L1.0-1": 1,
.
.
}
Run Code Online (Sandbox Code Playgroud)
键是组合,值是计数。
有了这个对象,通过按键来获取计数的速度非常快。
{
"L1-1": 3,
"L1-1_L1.0-1": 1,
"L1-3_L1.0-1": 1,
.
.
}
Run Code Online (Sandbox Code Playgroud)
const samples = [ "L1-1_L1.0-1_L1.0.0-1", "L1-1_L1.0-2_L1.0.0-1", "L1-1_L1.0-2_L1.0.0-2", "L1-2_L1.0-1_L1.0.0-1", "L1-2_L1.0-1_L1.0.0-2", "L1-3_L1.0-1_L1.0.0-3" ];
const result = samples.reduce((a, s) => {
let previous = "", separator = "";
s.split("_").forEach(t => {
previous += separator + t;
a[previous] = (a[previous] || (a[previous] = 0)) + 1;
separator = "_";
});
return a;
}, {});
console.log("L1-1:\t\t\t", result['L1-1']);
console.log("L1-1_L1.0-2:\t\t", result['L1-1_L1.0-2']);
console.log("L1-1_L1.0-2_L1.0.0-1:\t", result['L1-1_L1.0-2_L1.0.0-1']);
console.log("L1-1_L1.0-2_L1.0.0-2:\t", result['L1-1_L1.0-2_L1.0.0-2']);
console.log("L1-2:\t\t\t", result['L1-2']);Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }Run Code Online (Sandbox Code Playgroud)