簡體   English   中英

根據與數組中的值匹配的鍵過濾嵌套對象

[英]Filtering a nested Object based on keys which match values in an array

我在保留原始Object結構的同時,難以根據另一個數組過濾嵌套Object的鍵。

輸入:

data = [
          {0: { key: "A", values: { 0: {g1: 0, g2: 0, g3: 0, g4: 0}}}},
          {1: { key: "B", values: { 0: {g2: 0, g3: 0, g5: 0}}}}
       ]

arr = [g1, g2, g3]

預期產量:

data = [
          {0: { key: "A", values: { 0: {g1: 0, g2: 0, g3: 0}}}},
          {1: { key: "B", values: { 0: {g2: 0, g3: 0}}}}
       ]

到目前為止,我所做的是:

data.forEach(function(e,i) {
    r = Object.keys(e[i].values[0]).filter(d => arr.includes(d))
    console.log(r)
})

這樣可以正確打印[g1,g2,g3]和[g2,g3],但是我想保留原始的Object結構,而不僅僅是公共鍵的列表。

這段代碼可以滿足您的需求。 將數組r為一個對象,並將其分配給原始對象。

 var data = [ {0: { key: "A", values: { 0: {g1: 0, g2: 0, g3: 0, g4: 0}}}}, {1: { key: "B", values: { 0: {g2: 0, g3: 0, g5: 0}}}} ] var arr = ["g1", "g2", "g3"] var output = data.map(function(e,i) { var r = Object.keys(e[i].values[0]).filter(d => arr.includes(d)); var values = r.reduce((obj,key)=>{obj[key] = 0 ; return obj;},{}); var obj = {}; obj[i] = Object.assign(e[i],{values:{0:values}}) console.log(obj); return obj; }) console.log(output); 

實際上,這並不比從頭開始重建輸出對象好多少。

 var data = [ {0: { key: "A", values: { 0: {g1: 0, g2: 0, g3: 0, g4: 0}}}}, {1: { key: "B", values: { 0: {g2: 0, g3: 0, g5: 0}}}} ] var arr = ["g1", "g2", "g3"] var output = data.map(function(e,i) { var obj = {}; obj[i] = {key : e[i].key, values : {0:{}}}; arr.forEach((ele)=>{ if(e[i].values[0][ele] != undefined) { obj[i].values[0][ele] = e[i].values[0][ele]; } }); console.log(obj); return obj; }) console.log(output); 

假設您的data對象符合格式要求(說明已包含在代碼注釋中),則可能會用這種方法解決問題。

 function pruneObject(object, desiredKeys) { Object.keys(object) .filter(key => !desiredKeys.includes(key)) //Ignore desired keys .forEach(key => delete object[key]) //Remove the leftovers } var data = [{ 0: { key: "A", values: { 0: { g1: 0, g2: 0, g3: 0, g4: 0 } } } }, { 1: { key: "B", values: { 0: { g2: 0, g3: 0, g5: 0 } } } } ]; var arr = ['g1', 'g2', 'g3']; data.forEach((item,index) => pruneObject(item[index].values[0], arr)); //Prune each "values" object console.log(data); 

注意:這將修改原始對象,盡管如有必要,我可以編寫一個替代解決方案來保留它並返回一個新對象。

暫無
暫無

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

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