需要合并数组中的值

我有一组类似于这样的数据:

[
    "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);

您可以使用函数reduceforEach函数来计算每个令牌。

这种方法产生如下的对象:

{
    "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

上一篇: Need to merge values in array

下一篇: How to mask my landing page when user not signed in?