需要合并数组中的值

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库.

Ele*_*Ele 1

您可以将该函数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)