2017-08-17 27 views
0

我試圖把對象的數組,這樣地圖和減少對象的數組兒童陣列到孩子的陣列與父母的身份證

[ 
    { 
    "id": "uniqueParentId1", 
    "children": [ 
     { 
     "childProp1": "test1", 
     "childProp2": "test3" 
     } 
    ] 
    }, 
    { 
    "id": "uniqueParentId2", 
    "children": [ 
     { 
     "childProp1": "somevals", 
     "childProp2": "other vals" 
     }, 
     { 
     "childProp1": "somevals 1", 
     "childProp2": "other vals 1" 
     } 
    ] 
    } 
] 

,並返回所有的孩子相結合的陣列,每個子對象都有一個附加值,即父級的「id」。

上面的例子,結果。

[ 
    { 
    "parentId": "uniqueParentId1", 
    "childProp1": "test1", 
    "childProp2": "test3" 
    }, 
    { 
    "parentId": "uniqueParentId2", 
    "childProp1": "somevals", 
    "childProp2": "other vals" 
    } 
    { 
    "parentId": "uniqueParentId2", 
    "childProp1": "somevals 1", 
    "childProp2": "other vals 1" 
    } 
] 

我只是不知道如何解決這個問題。我熟悉扁平化和數組數組。但我只能夠得到的輸出作爲原始孩子的數組不添加parentId的

+0

短標題解釋更多FTW – DarkMukke

+0

不知道如何解釋它更短的 – user1738539

+0

例如'如何使用Map reduce來重新組織一個對象數組'。只要你提到:父母,孩子,身份證,它認爲我正在閱讀你的描述,而不是你的頭銜。 – DarkMukke

回答

1
const arr = [ 
    { 
    "id": "uniqueParentId1", 
    "children": [ 
     { 
     "childProp1": "test1", 
     "childProp2": "test3" 
     } 
    ] 
    }, 
    { 
    "id": "uniqueParentId2", 
    "children": [ 
     { 
     "childProp1": "somevals", 
     "childProp2": "other vals" 
     }, 
     { 
     "childProp1": "somevals 1", 
     "childProp2": "other vals 1" 
     } 
    ] 
    } 
]; 
let combined = []; 
arr.forEach((parent) => { 
    const {id, children} = parent; 
    children.forEach((child) => { 
    Object.assign(child, { 
     parentId: id 
    }); 
    combined.push(child); 
    }); 
}); 

console.log(combined); 
/* 
[ 
    { 
    "parentId": "uniqueParentId1", 
    "childProp1": "test1", 
    "childProp2": "test3" 
    }, 
    { 
    "parentId": "uniqueParentId2", 
    "childProp1": "somevals", 
    "childProp2": "other vals" 
    } 
    { 
    "parentId": "uniqueParentId2", 
    "childProp1": "somevals 1", 
    "childProp2": "other vals 1" 
    } 
] 
*/ 
3

這應做到:

var values = [{ 
 
    "id": "uniqueParentId1", 
 
    "children": [{ 
 
     "childProp1": "test1", 
 
     "childProp2": "test3" 
 
    }] 
 
    }, 
 
    { 
 
    "id": "uniqueParentId2", 
 
    "children": [{ 
 
     "childProp1": "somevals", 
 
     "childProp2": "other vals" 
 
     }, 
 
     { 
 
     "childProp1": "somevals 1", 
 
     "childProp2": "other vals 1" 
 
     } 
 
    ] 
 
    } 
 
]; 
 

 
var result = values.map(value => 
 
    value.children.map(child => Object.assign({ parentId: value.id }, child)) 
 
).reduce((l, n) => l.concat(n), []); 
 

 
console.log(result);

的細目代碼:

child => Object.assign({ parentId: value.id }, child) 

取一個對象,並返回一個警察該對象的y與parentId屬性相加。 value.id使用封閉變量value,這是功能以外。

輸入:

{ 
    "childProp1": "somevals", 
    "childProp2": "other vals" 
} 

輸出:

{ 
    "parentId": "uniqueParentId2" 
    "childProp1": "somevals", 
    "childProp2": "other vals" 
} 

下一頁功能:

value => 
    value.children.map(child => Object.assign({ parentId: value.id }, child)) 

注意到命名value一個對象,在value.children應用於上面的功能到每一個陣列元件的,並返回結果數組。

下一頁:

values.map(.....) 

適用上述函數到每個元件中values並返回結果的數組。

在這一點上,這.map()調用的結果是類似以下的數組,其中一個元素爲原數組的每個元素:

[ 
    [ 
    { 
     "parentId": "uniqueParentId1", 
     "childProp1": "test1", 
     "childProp2": "test3" 
    } 
    ], 
    [ 
    { 
     "parentId": "uniqueParentId2", 
     "childProp1": "somevals", 
     "childProp2": "other vals" 
    }, 
    { 
     "parentId": "uniqueParentId2", 
     "childProp1": "somevals 1", 
     "childProp2": "other vals 1" 
    } 
    ] 
] 

所以我們做的最後一件事就是拉平拉平這個數組與.reduce((l, r) => l.concat(r), []),這是一個通用的方法來壓扁數組。這將一個空數組作爲「種子」值,並逐個連接數組以產生最終結果。這個扁平化的行動

例子:

var arrayOfArrays = [[1,2,3],[4,5],[6,7,8,9]]; 
 

 
var explain = (l, r) => 
 
    console.log('concatenating', JSON.stringify(l), 'with', JSON.stringify(r)); 
 

 
var result = arrayOfArrays.reduce(
 
    (l, r) => (explain(l, r), l.concat(r)), []); 
 

 
console.log("result:", JSON.stringify(result));

+0

喜歡你的解決方案!也許增加幾行解釋你的代碼,讓其他不熟悉功能性js的人可以理解你的解決方案? –

+1

@AP。感謝您的建議。增加了一個解釋,但結果卻超過了幾行。 :) – JLRishe

0

如果應用功能更強大的方法,你可以這樣做:

const results = [] //Array we want to store all data in 
arr.forEach(e => { 
    const {id: parentId} = e //Extract id as variable parentId 

    // Store all the children objects with the added key 
    e.children.forEach(c => results.push(Object.assign({parentId}, c))) 
})