需要合并数组中的值
我有一组类似于这样的数据:
[
"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"
];
我需要找到一种方法来获得每个这些字符串的可引用分层计数。
例如
多少个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库。
您可以只计算以加入的问题字符串开头的给定字符串。
var data = ["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"],
questions = [['L1-1'], ['L1-1', 'L1.0-2'], ['L1-1', 'L1.0-2', 'L1.0.0-1'], ['L1-1', 'L1.0-2', 'L1.0.0-2'], ['L1-2']],
answers = questions.map(
q => data.reduce((r, d) => r + d.startsWith(q.join('_')), 0)
);
console.log(answers);
您可以使用函数reduce
和forEach
函数来计算每个令牌。
这种方法产生如下的对象:
{
"L1-1": 3,
"L1-1_L1.0-1": 1,
"L1-3_L1.0-1": 1,
.
.
}
键是组合,值是计数。
有了这个对象,通过密钥获得计数的速度就非常快。
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:ttt", result['L1-1']);
console.log("L1-1_L1.0-2:tt", 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:ttt", result['L1-2']);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://codepen.io/egomezr/pen/dmLLwP.js"></script>
您可以使用每个子级别的键和count
属性来构建嵌套对象,以指示该级别出现多少次,例如
{
'L1-1': {
count: 2,
'L1.0-1': {
count: 1,
...
},
'L1.0-2': {
...
}
},
...
}
这可以用类似的东西来完成
var data = [
"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"
];
function insert(object,key) {
if (!object[key]) {
object[key] = {};
object[key].count = 1;
} else {
object[key].count++;
}
}
var answers = data.reduce(function(a,c) {
var strings = c.split('_');
strings.reduce(function(ap,cp){
insert(ap, cp);
return ap[cp];
}, a)
return a;
}, {})
console.log(answers)
链接地址: http://www.djcxy.com/p/851.html