以相等的值过滤数组

时间:2018-04-18 08:47:48

标签: javascript arrays

我有一个数组:

let array = ['yay', 'yay', 'yay', 'opps', 'yay', 'yay', 'opps', 'opps', 'opps'];

如果我需要它,我该如何过滤这个数组:

let filterArray = [['yay', 3] ['opps', 1], ['yay', 2], ['opps' 3]];

谢谢。

7 个答案:

答案 0 :(得分:5)

您可以使用Array.reduce方法迭代原始数组并创建新数组。

  • 如果acc(累积数组)为空,请按数组中的[curr, 1](当前变量和计数)
  • 如果acc(累积数组)最后推送索引包含curr变量,则更新计数
  • 如果acc(累积数组)上次推送的索引不包含curr变量,请在[curr, 1]中推送acc

let array = ['yay', 'yay', 'yay', 'opps', 'yay', 'yay', 'opps', 'opps', 'opps'];

let modifiedArray = array.reduce((acc, curr) => {
  if (!acc.length) {
    acc.push([curr, 1]);
  } else {
    let lastPushedArray = acc[acc.length-1];
    if (lastPushedArray[0] === curr) {
      acc[acc.length-1][1]++;
    } else {
      acc.push([curr, 1]);
    }
  }
  return acc;
}, []);

console.log(modifiedArray);

答案 1 :(得分:2)

您可以通过检查临时结果集的最后一个元素来减少数组。

var array = ['yay', 'yay', 'yay', 'opps', 'yay', 'yay', 'opps', 'opps', 'opps'],
    result = array.reduce((r, v) => {
        var last = r[r.length - 1];
        if (last && last[0] === v) {
            last[1]++;
        } else {
            r.push([v, 1]);
        }
        return r;
    }, []);
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:2)

使用reduce

arr.reduce( (a,c) => {
   var lastValue = (a[a.length - 1] || [])[0]; //find last item in accumulator a
   c == lastValue ? a[a.length - 1][1]++ : a.push([c,1]); //if last value is same then increase count, else add new item
   return a; 
} ,[]) //initialize accumulator a to empty array

<强>演示

var arr = ['yay', 'yay', 'yay', 'opps', 'yay', 'yay', 'opps', 'opps', 'opps'];

var output = arr.reduce( (a,c) => {
   var lastValue = (a[a.length - 1] || [])[0];
   c == lastValue ? a[a.length - 1][1]++ : a.push([c,1]);
   return a; 
} ,[]);
console.log( output );

答案 3 :(得分:0)

尝试以下代码。这不会给你准确的输出。但您可以按照以下方法生成所需的输出。

var array = ['yay', 'yay', 'yay', 'opps', 'yay', 'yay', 'opps', 'opps', 'opps'];
var newArray = {};
array.map( function (a) { if (a in newArray) newArray[a] ++; else newArray[a] = 1; } );
console.log(newArray);

输出

  

{yay:5,opps:3}

答案 4 :(得分:0)

又一个解决方案:

&#13;
&#13;
let array = ['yay', 'yay', 'yay', 'opps', 'yay', 'yay', 'opps', 'opps', 'opps'];
let rs = {};
array.forEach((w) => rs[w] == undefined ? rs[w] = 1 : rs[w] += 1);
let result = Object.keys(rs).map((key) => [key, rs[key]]);
console.log(result);
&#13;
&#13;
&#13;

答案 5 :(得分:0)

您可以使用*ngFor对数组中的相似单词进行分组,并重复单词增量计数。

array#reduce

答案 6 :(得分:0)

您可以使用:

let filterArray = array.reduce((acc, item) => {
    let similarItemIndex = acc.findIndex(i => i[0] === item);

    if (similarItemIndex > -1) {
        acc.push([item, 1]);
    } else {
        acc[similarItemIndex] = [item, acc[similarItemIndex][0] + 1];
    }

    return acc;
}, []);