簡體   English   中英

通過鍵數組訪問對象的屬性

[英]Access a property on an object from an array of keys

我想編寫一個輔助函數,以從對象數組中的每個對象中解壓縮特定的對象屬性。 有時,此屬性將是頂級的,而其他時候,它將嵌套任意數量的級別。 因此,這個問題的症結在於:如何基於可變長度的鍵名數組訪問對象屬性?

我希望有這樣的東西:

const func = (arrOfObjects, ...keys) {
    return arrOfObjects.map(object => {
        return object[keys[0]][keys[1]] ... [keys[N]];
    })
}

具有示例行為:

const input = [
    {a: b: {c: 10}},
    {a: b: {c: 11}},
    {a: b: {c: 12}}
]

console.log(func(input, 'a', 'b', 'c'))
// [10, 11, 12]
console.log(func(input, 'a', 'b'))
// [{c: 10}, {c: 11}, {c : 12}]

我覺得必須有一個不錯的ES6向導解決方案,但尚未找到它,因此對您有所幫助!

干杯,

P

如果提供像[a, b, c[0], name] ,則可以編寫一個自定義函數,如果在嵌套對象中找到該函數,則返回該值,否則返回未定義

  let obj = { a: 1, b: 2, c: { d: 1, e: [{ f: 3, g: [{ z: 45 }] }] } } function findKeyFromPattern(obj, patternArr) { let value = obj; for(let i = 0; i < patternArr.length; i++) { const arrmatch = patternArr[i].match(/(\\w+)\\[(\\d+)\\]/); if(arrmatch) { // pattern matches and array accessor syntax value = value[arrmatch[1]]; if(typeof value === 'object' && value !== null) { value = value[arrmatch[2]]; } else { return; } } else { if(value[patternArr[i]]) { value = value[patternArr[i]]; } else { return; } } } return value; } console.log(findKeyFromPattern(obj, ['c', 'e[0]', 'g'])); console.log(findKeyFromPattern(obj, ['c', 'e[1]', 'g'])) 

您可以使用Array#reduce來獲得一個簡短而簡單的解決方案

 const input = [ {a: { b: {c: 10}}}, {a: { b: {c: 11}}}, {a: { b: {c: 12}}} ] console.log(func(input, ['a', 'b', 'c'])) // [10, 11, 12] console.log(func(input, ['a', 'b'])) // [{c: 10}, {c: 11}, {c : 12}] function func(input, props) { return input.map(x => exctractByProps(x, props)); } function exctractByProps(obj, props) { return props.reduce( (acc, prop) => typeof acc === 'object' && prop in acc ? acc[prop] : undefined, obj ) } 

主要邏輯是獲取傳入的所有屬性,然后嘗試獲取與obj[prop[0]][prop[1]][prop[2]]/* ... */[prop[n]] 如果對象的形狀與prop不匹配(例如,輸入{a: 1}, ['a', 'b']{d: {c: 1}}, ['a', 'b'] )),則函數返回undefined

根據您給我的問題和示例給出的答案。 似乎輸入的順序將始終與對象嵌套匹配。 所以這是我的解決方案:

 const func = (arrOfObjects, ...keys) => { return arrOfObjects.map(object => { let obj = object, integer = keys.length; for (let index = 0; index < integer; index++) { obj = obj[keys[index]]; if(obj === undefined) break; } return obj; }); }; const input = [ { a: { b: { c: 10 } } }, { a: { b: { c: 11 } } }, { a: { b: { c: 12 } } } ]; console.log(func(input, "a", "b", "c")); // [10, 11, 12] console.log(func(input, "a", "b")); // [{c: 10}, {c: 11}, {c : 12}] 

不幸的是,您所期待的並不是javascript魔術。 注意:當對象內的鍵的順序以隨機深度嵌套時,此代碼將不起作用。 但是對於您要解決的問題,這應該可以正常工作。 另外,我嘗試盡可能保留您的初始代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM