Summieren Sie Werte der JavaScript-ObjekteigenschaftA mit derselben ObjekteigenschaftB in einem Array von Objekten

Lesezeit: 6 Minuten

Benutzer-Avatar
AlecPerkey

Wie würde man ein JavaScript-Array von Objekten nehmen, wie z

my objArr = [
    {key:Mon Sep 23 2013 00:00:00 GMT-0400, val:42},
    {key:Mon Sep 24 2013 00:00:00 GMT-0400, val:78},
    {key:Mon Sep 25 2013 00:00:00 GMT-0400, val:23},
    {key:Mon Sep 23 2013 00:00:00 GMT-0400, val:54}]

und doppelte Schlüssel durch Summieren der Werte zusammenführen?

Um sowas zu bekommen:

my reducedObjArr = [
    {key:Mon Sep 23 2013 00:00:00 GMT-0400, val:96},
    {key:Mon Sep 24 2013 00:00:00 GMT-0400, val:78},
    {key:Mon Sep 25 2013 00:00:00 GMT-0400, val:23}]

Ich habe versucht, ein neues Array zu iterieren und hinzuzufügen, aber das hat nicht funktioniert:

var reducedObjArr = [];
var item = null, key = null;
for(var i=0; i<objArr.length; i++) {
    item = objArr[i];
    key = Object.keys(item)[0];
    item = item[key];

    if(!result[key]) {
        result[key] = item;
    } else {
       result[key] += item;
    }
}a

  • Warum tust du key = Object.keys(item)[0]; item=item[key]; ? Sie wissen bereits, der Name ist keyalso tu es einfach item.key oder objArr[i].key. Auch die Verwendung von [0] index gibt Ihnen nicht unbedingt immer die gleiche Eigenschaft.

    – Benutzer2736012

    7. Oktober 2013 um 19:50 Uhr


  • Danke, suche dasselbe,,

    – Soumya Gangamwar

    30. Oktober 2020 um 11:57 Uhr

  • Funktioniert es ohne die Zeichenfolgen zu zitieren, z Mon Sep 23 2013 00:00:00 GMT-0400?

    – Peter Mortensen

    Vor 18 Stunden

Benutzer-Avatar
Hamms

Anstatt eine zu verwenden zum Loop- und Push-Werte, die Sie direkt verwenden können Karte und reduzieren:

let objArr = [
  {key: 'Mon Sep 23 2013 00:00:00 GMT-0400', val: 42},
  {key: 'Mon Sep 24 2013 00:00:00 GMT-0400', val: 78},
  {key: 'Mon Sep 25 2013 00:00:00 GMT-0400', val: 23},
  {key: 'Mon Sep 23 2013 00:00:00 GMT-0400', val: 54}
];

// first, convert data into a Map with reduce
let counts = objArr.reduce((prev, curr) => {
  let count = prev.get(curr.key) || 0;
  prev.set(curr.key, curr.val + count);
  return prev;
}, new Map());

// then, map your counts object back to an array
let reducedObjArr = [...counts].map(([key, value]) => {
  return {key, value}
})

console.log(reducedObjArr);

  • Kann mit map/reduce auch eine separate Zählung hinzugefügt werden. Beispiel: 23. September, Zählung ist 2, für 24. & 25. Zählung ist 1.

    – Gunjan Anshul

    10. Dezember 2020 um 9:03 Uhr

  • Ja! Du würdest einfach so etwas tun count + 1 anstatt curr.val + count in dem prev.set Forderung

    – Hamms

    10. Dezember 2020 um 23:03 Uhr

Benutzer-Avatar
Benutzer2736012

Sie sollten jedes nicht gefundene Objekt mit seinem dem Ergebnis zuweisen .key Eigentum.

Wenn es gefunden wird, müssen Sie es hinzufügen .val.

var temp = {};
var obj = null;
for(var i=0; i < objArr.length; i++) {
   obj=objArr[i];

   if(!temp[obj.key]) {
       temp[obj.key] = obj;
   } else {
       temp[obj.key].val += obj.val;
   }
}
var result = [];
for (var prop in temp)
    result.push(temp[prop]);

Ein Teil des Problems war auch, dass Sie die wiederverwendeten item Variable, um auf den Wert zu verweisen .keysodass Sie den Verweis auf das Objekt verloren haben.

Benutzer-Avatar
mplungjan

Einfachere Reduzierung als an anderer Stelle gepostet, da kein Kartenelement verwendet wird

const objArr = [
{key:"Mon Sep 23 2013 00:00:00 GMT-0400", val:42},
{key:"Mon Sep 24 2013 00:00:00 GMT-0400", val:78},
{key:"Mon Sep 25 2013 00:00:00 GMT-0400", val:23},
{key:"Mon Sep 23 2013 00:00:00 GMT-0400", val:54}];

const output = objArr.reduce((accumulator, cur) => {
  let date = cur.key;
  let found = accumulator.find(elem => elem.key === date)
  if (found) found.val += cur.val;
  else accumulator.push(cur);
  return accumulator;
}, []);

console.log(output)

  • Dennoch wäre eine Erklärung angebracht. ZB auf welche Weise ist es einfacher? Was ist die Idee/der Kern? Aus dem Hilfecenter: “…erklären Sie immer, warum die von Ihnen vorgestellte Lösung angemessen ist und wie sie funktioniert”. Bitte antworten Sie, indem Sie Ihre Antwort bearbeiten (ändern), nicht hier in den Kommentaren (ohne “Bearbeiten:”, “Aktualisieren:” oder ähnliches – die Antwort sollte so aussehen, als wäre sie heute geschrieben).

    – Peter Mortensen

    Vor 18 Stunden


  • Es verwendet keine Karte. Aktualisiert. Es ist nur einfacher Code.

    – mplungjan

    Vor 17 Stunden

Benutzer-Avatar
Nina Scholz

Sie könnten eine Hash-Tabelle für die Gruppierung nach verwenden key.

var array = [{ key: 'Mon Sep 23 2013 00:00:00 GMT-0400', val: 42 }, { key: 'Mon Sep 24 2013 00:00:00 GMT-0400', val: 78 }, { key: 'Mon Sep 25 2013 00:00:00 GMT-0400', val: 23 }, { key: 'Mon Sep 23 2013 00:00:00 GMT-0400', val: 54}],
    grouped = [];

array.forEach(function (o) {
    if (!this[o.key]) {
        this[o.key] = { key: o.key, val: 0 };
        grouped.push(this[o.key]);
    }
    this[o.key].val += o.val;
}, Object.create(null));

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Ein anderer Ansatz besteht darin, alle Schlüssel/Wert-Paare in einem zu sammeln Map und formatieren Sie das endgültige Array mit Array.from und ein Callback für die Objekte.

var array = [{ key: 'Mon Sep 23 2013 00:00:00 GMT-0400', val: 42 }, { key: 'Mon Sep 24 2013 00:00:00 GMT-0400', val: 78 }, { key: 'Mon Sep 25 2013 00:00:00 GMT-0400', val: 23 }, { key: 'Mon Sep 23 2013 00:00:00 GMT-0400', val: 54 }],
    grouped = Array.from(
        array.reduce((m, { key, val }) => m.set(key, (m.get(key) || 0) + val), new Map),
        ([key, val]) => ({ key, val })
    );

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

var targetObj = {};
for (var i = 0; i < objArr.length; i++) {
    if (!targetObj.hasOwnProperty(objArr[i].key)) {
        targetObj[objArr[i].key] = 0;
    }
    targetObj[objArr[i].key] += objArr[i].val;
}

http://jsfiddle.net/HUMxp/

  • OP will die gleichen Schlüssel/Wert-Paare, aber mit der val konsolidiert.

    – Benutzer2736012

    7. Oktober 2013 um 20:11 Uhr

Benutzer-Avatar
Peter Mortensen

Versuche dies. Es sollte helfen.

var arr1 = [
    { name: 'besart', value: 12 },
    { name: 'astrit', value: 10 },
    { name: 'astrit', value: 10 },
    { name: 'besar', value: 18 },
    { name: 'besar', value: 3 },
    { name: 'astrit', value: 3 },
    { name: 'besart', value: 3 },
    { name: 'besart', value: 10 },
    { name: 'besar', value: 0 },
];

var arr2 = [];
var emri = "";
var value = 0;
for(var i = 0; i<arr1.length; i++) {
    emri = arr1[0].name;
    value += arr1[0].value;
    for(var j=1; j<arr1.length; j++) {
        if(emri == arr1[j].name) {
            value += arr1[j].value;
            arr1.splice(j, 1);
            j--;
        }
    }
    arr1.splice(0, 1);
    arr2[i] = {name:emri, value:value};
    value = 0;
}
console.log(arr2);

Unten ist eine andere Lösung, die nur eine Schleife verwendet (a während Schleife):

var arr2 = [];
var emri = "";
var value = 0;
var i = 1;
var j = 0;

while(arr1.length != 0) {
    emri = arr1[0].name;
    if(emri == arr1[i].name) {
        value += arr1[i].value;
        arr1.splice(i, 1);
        i--;
    }
    i++;
    if(i == arr1.length) {
        value += arr1[0].value;
        i = 1;
        arr2[j] = {name:emri, value:value};
        j++;
        value = 0;
        arr1.splice(0, 1);
    }
}

  • OP will die gleichen Schlüssel/Wert-Paare, aber mit der val konsolidiert.

    – Benutzer2736012

    7. Oktober 2013 um 20:11 Uhr

Benutzer-Avatar
Ungemindert

Man kann verwenden Array#reduce mit einem Objekt zum Speichern der Werte für jeden Schlüssel.

let arr = [{key:'Mon Sep 23 2013 00:00:00 GMT-0400', val:42},{key:'Mon Sep 24 2013 00:00:00 GMT-0400', val:78},{key:'Mon Sep 25 2013 00:00:00 GMT-0400', val:23},{key:'Mon Sep 23 2013 00:00:00 GMT-0400', val:54}];
let res = Object.values(arr.reduce((acc, curr)=>{
  (acc[curr.key] = acc[curr.key] || {key: curr.key, val: 0}).val += curr.val;
  return acc;
}, {}));
console.log(res);

Bei neueren Browsern logische Nullzuweisung kann verwendet werden.

let arr = [{key:'Mon Sep 23 2013 00:00:00 GMT-0400', val:42},{key:'Mon Sep 24 2013 00:00:00 GMT-0400', val:78},{key:'Mon Sep 25 2013 00:00:00 GMT-0400', val:23},{key:'Mon Sep 23 2013 00:00:00 GMT-0400', val:54}];
let res = Object.values(arr.reduce((acc, curr)=>{
  (acc[curr.key] ??= {key: curr.key, val: 0}).val += curr.val;
  return acc;
}, {}));
console.log(res);

  • Ah, endlich mal eine Nicht-„probier mal“-Antwort!

    – Peter Mortensen

    vor 6 Stunden

1011460cookie-checkSummieren Sie Werte der JavaScript-ObjekteigenschaftA mit derselben ObjekteigenschaftB in einem Array von Objekten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy