计算和删除嵌套数组中的多个元素

时间:2018-09-14 13:20:49

标签: javascript typescript

这是我的数组的结构:

arrayParent = [numbers, counter];

numbers = [1,1,1,2,4,5];
counter = [];

我想做的是在“数字”中计数多个元素,并在第一次删除时将其推到“计数器”,最后看起来应该像这样:

numbers = [1,2,4,5];
counter = [3,1,1,1];

我尝试了这个(以及许多其他版本):

for(var y =0; y < arrayParent.length; y++){
 for(var x = 0; x < arrayParent[y].numbers.length; x++){
    var co = 1;
    for(var z = x+1; z < arrayParent[y].numbers.length; z++){
      if(arrayParent[y].numbers[x] == arrayParent[y].ans[z]){
          co++;
          arrayParent[y].numbers.splice(z);
          arrayParent[y].counter[x] = co;
       }
     }
   }
}

我得到的结果:

numbers = [1,2,4,5];
counter = [3,,,];

任何想法如何解决?

2 个答案:

答案 0 :(得分:1)

您可以尝试以下操作:

let numbers = [1,1,1,2,4,5];
let counter = [];

const tmp = numbers.reduce((res, curr) => ({
  ...res,
  [curr]: (res[curr] || 0) + 1
}), {});

numbers = Object.keys(tmp).map(Number);
counter = Object.values(tmp);

console.log(numbers, counter);

所以,我创建了一个计数器对象,其中键是不同的数字,值是它们的计数器

@nikhil正确地注意到此方法不会保留数字顺序,要保留它,只需将JS对象更改为JS Map,其逻辑是相同的:

let numbers = [1,1,1,2,5, 4];
let counter = [];

const tmp = numbers.reduce((res, curr) => res.set(curr, (res.get(curr) || 0) + 1), new Map());

numbers = [...tmp.keys()];
counter = [...tmp.values()];

console.log(numbers, counter);

答案 1 :(得分:0)

您可以尝试关注

let arrayParent = {numbers : [1,1,1,2,4,5], counter : []};
// This will ensure that the order of elements is same as in the array
let order = [];
// Create an object with key as `number` and counts as its value
let map = arrayParent.numbers.reduce((a,c) => {
  if(a[c]) a[c]++;
  else {a[c] = 1; order.push(c); }
  return a;
}, new Map());
// Set the value of order in numbers
arrayParent.numbers = order;
// Set the counts in counter
order.forEach(o => arrayParent.counter.push(map[o]));

console.log(arrayParent);

相关问题