簡體   English   中英

javascript中數組與深度嵌套對象的交集

[英]Intersection of an array with a deeply nested object in javascript

我想包含數組中存在的對象的所有鍵並丟棄其余鍵,例如,如果我有一個數組

const arr = ['apple', 'milk', 'bread', 'coke'];

和一個對象

const dummy = {
    apple: {
        category: 'fruit'
    },
    banana: {
        category: 'fruit'
    },
    potato: {
        category: 'vegetable'
    },
    dairy: {
        milk: {
          type: 'A2'
        }
    },
    bakery: {
        bread: {
            type: 'brown'
        }
    },
    beverage: {
      cold_drink: {
        coke: {
          type: 'diet'
        },
        beer: {
        }
      }
    }
}

我希望我的結果對象僅包含來自arr的鍵,無論是直接鍵還是深度嵌套。 所以對於上述情況,我的結果對象看起來像,

{
    apple: {
        category: 'fruit'
    },
    dairy: {
        milk: {
          type: 'A2'
        }
    },
    bakery: {
        bread: {
            type: 'brown'
        }
    },
    beverage: {
      cold_drink: {
        coke: {
          type: 'diet'
        },
        beer: {}
      }
    }
}

我試圖通過遞歸解決這個問題,但無法正確獲得輸出。 下面是我的代碼,你能幫我解決我哪里出錯了嗎?

function fetchResultantObject(object, key, result) {
  if(typeof object !== 'object')
    return null;
  for(let objKey in object) {
    if(key.indexOf(objKey) > -1) {
      result[objKey] = object[objKey];
    } else {
      result[objKey] = fetchValueByKey(object[objKey], key, result);
    }
  }
  return result;
}

console.log(fetchResultantObject(dummy, arr, {}));

您可以過濾條目並檢查(嵌套)對象是否包含想要的鍵。

 const hasKey = object => object && typeof object === 'object' && (keys.some(k => k in object) || Object.values(object).some(hasKey)), keys = ['apple', 'milk', 'bread', 'coke'], data = { apple: { category: 'fruit' }, banana: { category: 'fruit' }, potato: { category: 'vegetable' }, dairy: { milk: { type: 'A2' } }, bakery: { bread: { type: 'brown' } }, beverage: { cold_drink: { coke: { type: 'diet' } } } }, result = Object.fromEntries(Object .entries(data) .filter(([k, v]) => hasKey({ [k]: v })) ); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

暫無
暫無

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

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