2017-07-25 76 views
-3

我有這樣的對象數組:的Javascript - 比較對象的數組,總結重合值

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}, 
    .... 
] 

現在,我需要做的是比較「X」值,如果兩者相符,則轉院總結出「一「和」b「值在另一個陣列中。例如:

ARR2 = [{A = 2,B = 1,X = 100},{A = 2,B = 1,X = 200} ....]

第二事,是要計算有多少個對象以相同的「x」值進行連接。例如,在第一個「arr2」對象中加入3個「arr」對象,在第二個「arr2」對象中加入2個「arr」對象等等。

+0

家庭作業? – Will

+2

請向我們展示您的嘗試。 – Bergi

+0

您是否知道您的數據有語法錯誤? –

回答

1

這個問題似乎沒有道理。首先,「一致」一詞沒有我知道的技術定義。你能更清楚你的意思嗎?其次它並不清楚你的預期結果是什麼。也許如果我是你,我會做的只是從一些簡單的示例輸入開始,然後提出你期望的相應輸出結果,然後使用單元測試工具來開發代碼來做你想做的事情。

例如,我有猜測你想要什麼,但它可能會使用的庫薛寶釵和摩卡看起來像這樣(在JavaScript):

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

這種技術可以幫助你來一個答案上你自己。

試着讓你的術語更精確一些,並舉例說明你期望得到什麼樣的結果。

0

數組縮小和映射是有趣的方法。 Object.keys()將爲您提供一組鍵,並讓您可以進行更多的數組縮減和映射。娛樂時間。

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