Ich habe ein Array:

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

Wie kann ich dieses Array filtern, wenn ich es im Ergebnis benötige:

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

Vielen Dank.

1
Valera Checha 18 Apr. 2018 im 11:47

7 Antworten

Beste Antwort

Mit der Methode Array.reduce können Sie Ihr ursprüngliches Array durchlaufen und das neue Array erstellen.

  • Wenn acc (akkumuliertes Array) leer ist, drücken Sie [curr, 1] (aktuelle Variable und Anzahl) in das Array
  • Wenn der zuletzt gepusste Index acc (akkumuliertes Array) die Variable curr enthält, aktualisieren Sie die Anzahl
  • Wenn der zuletzt gepusste Index acc (akkumuliertes Array) nicht die Variable curr enthält, drücken Sie die [curr, 1] in 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);
5
Anurag Singh Bisht 18 Apr. 2018 im 08:57

Verwenden Sie 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

Demo

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 );
2
gurvinder372 18 Apr. 2018 im 09:02

Sie können das Array reduzieren, indem Sie das letzte Element der temporären Ergebnismenge überprüfen.

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
Nina Scholz 18 Apr. 2018 im 08:54

Sie können dies verwenden:

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;
}, []);
0
Madmadi 18 Apr. 2018 im 09:17

Sie können array#reduce verwenden, um ähnliche Wörter in einem Array zu gruppieren und die Anzahl der wiederholten Wortinkremente zu erhöhen.

let array = ['yay', 'yay', 'yay', 'opps', 'yay', 'yay', 'opps', 'opps', 'opps'],
    result = array.reduce((r,word,i,a) => {
      word == a[i-1] ? r[r.length - 1][1]++ : r.push([word, 1]);
      return r;
    },[]);
console.log(result);
0
Hassan Imam 18 Apr. 2018 im 08:59

Versuchen Sie den folgenden Code. Dies gibt Ihnen nicht die genaue Ausgabe. Sie können jedoch die folgende Methode anwenden, um die gewünschte Ausgabe zu generieren.

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

Ausgabe

{Jahr: 5, Betrieb: 3}

0
Harsha W 18 Apr. 2018 im 08:51

Noch eine andere Lösung:

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);
0
Anurag Singh Bisht 18 Apr. 2018 im 09:00