2017-07-25 4 views
-3

Ich habe dieses Array von Objekten:Javascript - Vergleichen Array von Objekten und Summe übereinstimmt Werte

arr=[ 
    {a: 1,b: 0,x: 100}, 
    {a: 0,b: 0,x: 100}, 
    {a: 1,b: 1,x: 100}, 
    {a: 1,b: 0,x: 200}, 
    {a: 1,b: 1,x: 200}, 
    .... 
] 

Nun, was ich tun muss, um zu vergleichen ist „x“ Werte und wenn sie übereinstimmen, Tranfer summiert „a "und" b "-Werte in einem anderen Array. Zum Beispiel:

arr2 = [{a = 2, b = 1, x = 100}, {a = 2, b = 1, x = 200} ....]

Zweiter, was zu tun , zählt, wie viele Objekte mit demselben "x" -Wert verbunden wurden. Zum Beispiel werden in dem ersten "arr2" -Objekt 3 "arr" -Objekte und in dem zweiten "arr2" -Objekt 2 "arr" -Objekte und so weiter verbunden.

+0

Hausaufgabe? – Will

+2

Bitte zeigen Sie uns Ihren Versuch. – Bergi

+0

Ist Ihnen bewusst, dass Ihre Daten Syntaxfehler aufweisen? –

Antwort

1

Diese Frage scheint keinen Sinn zu ergeben. Zuallererst hat das Wort "übereinstimmend" keine technische Definition, die mir bekannt ist. Kannst du klarer darüber sein, was du meinst?

Zweitens ist nicht klar, was Ihre erwarteten Ergebnisse sind. Vielleicht, was ich tun würde, wenn ich Sie wäre, würde mit einigen einfachen Beispieleingaben beginnen und dann kommen, was Sie die entsprechende Ausgabe erwarten würde, dann verwenden Sie ein Unit-Test-Tool, um den Code zu entwickeln, was Sie wollen.

Zum Beispiel muss ich erraten, was Sie wollen, aber es könnte so aussehen (in Javascript) unter Verwendung der Bibliotheken chai und Mokka:

import { expect } from 'chai' 

function doWork(input) { 
    // code goes here 
} 

const tests = [ 
    { 
    name: 'Same x values coalesce', 
    data: [ 
     {a=1,b=0,x=100}, 
     {a=0,b=0,x=100} 
    ], 
    expected: { 
     100: [1, 0] 
    } 
    } 
] 
describe('work',() => { 
    tests.forEach(test => { 
    it(t.name,() => { 
     const result = doWork(test.data) 
     expect(result).to.deep.equal(test.expected) 
    }) 
    }) 
}) 

Diese Technik kann zu dem Sie eine Antwort helfen kommen dein eigenes.

Versuchen Sie, ein wenig genauer mit Ihren Bedingungen zu sein und geben Sie ein Beispiel von dem, was Sie als Ausgabe erwarten.

0

Array reduzieren und Karte sind Spaß Methoden. Object.keys() wird Ihnen ein Array von Schlüsseln geben, mit dem Sie mehr Arrays reduzieren und zuordnen können. Spaß mal.

let arr = [ 
 
     { a: 1, b: 0, x: 100 }, 
 
     { a: 0, b: 0, x: 100 }, 
 
     { a: 1, b: 1, x: 100 }, 
 
     { a: 1, b: 0, x: 200 }, 
 
     { a: 1, b: 1, x: 200 } 
 
    ]; 
 

 
    let lists = arr.reduce((prev, curr) => { 
 
     let list = prev[curr.x] || []; 
 
     list.push(curr); 
 
     prev[curr.x] = list; 
 
     return prev; 
 
    }, {}); 
 

 
    console.log(lists); 
 

 
    let flat = Object.keys(lists).reduce((prev, curr) => { 
 
     prev.push(
 
      lists[curr].reduce(
 
       (prev, curr) => { 
 
        prev.a += curr.a; 
 
        prev.b += curr.b; 
 
        prev.x = curr.x; 
 
        return prev; 
 
       }, 
 
       { a: 0, b: 0 } 
 
      ) 
 
     ); 
 

 
     return prev; 
 
    }, []); 
 

 
    console.log(flat); 
 

 
    Object.keys(lists).forEach(el => console.log(el + ': ' + lists[el].length));

Verwandte Themen