簡體   English   中英

如何在對象數組上使用Array.protoype.map()來基於其值過濾掉某些特定鍵?

[英]How to use Array.protoype.map() on array of objects to filter out some specific keys based on it's values?

我有以下對象數組,其中某些特定鍵的值可以是字符串或數組。 我想按原樣獲取具有字符串值的鍵,並從具有數組值的鍵中刪除“ NA”。

我試圖通過在數組上執行.map方法來實現相同目的,檢查數據對象中每個鍵的值的類型,如果數組,則使用.filter刪除“ NA”值。

var dataArr = [
    {
     a: 'foo',
     b: [1, 2, "NA", "NA", 3],
     c: ["NA", 6]
    },
    {
     a: 'bar',
     b: ["NA", "NA", "NA"],
     c: []
    }
];
dataArr.map(dataObj => {
    for (let key in dataObj) {
        if (key !== 'a')
            dataObj[key] = dataObj[key].filter(val => { if(val != "NA") return val})
    }
    return dataObj;
});

上面的代碼塊按預期工作,但是我想要一個更好的,面向未來的解決方案。 而且,這看起來也很糟糕。

您可以使用嵌套的map()filter()來做到這一點

  • 首先在主數組上使用map()
  • 然后使用Object.entries()獲取每個對象的條目
  • 然后在每個對象的條目上使用map()
  • 如果Array.isArrayfalseArray.isArray返回值,否則返回數組的過濾后的值。
  • 最后使用Object.fromEntries()制作一個對象。

 var dataArr = [ { a: 'foo', b: [1, 2, "NA", "NA", 3], c: ["NA", 6] }, { a: 'bar', b: ["NA", "NA", "NA"], c: [] } ]; const res = dataArr.map(x => Object.fromEntries( Object.entries(x) .map(([k,v]) => [k,Array.isArray(v) ? v.filter(b => b !== "NA") : v]) ) ) console.log(res) 

如果只想更新原始數組,則可以使用forEach遍歷該數組。 然后使用for...in遍歷每個對象的鍵for...in並使用Array.isArray()檢查它是否為數組。 濾除 NA值后更新屬性

 const dataArr = [{a:'foo',b:[1,2,"NA","NA",3],c:["NA",6]},{a:'bar',b:["NA","NA","NA"],c:[]}]; dataArr.forEach(o => { for (const key in o) { if (Array.isArray(o[key])) o[key] = o[key].filter(s => s !== "NA") } }) console.log(dataArr) 

如果要獲得一個新的數組而不改變原始對象,則可以使用如下所示的map

 const dataArr = [{a:'foo',b:[1,2,"NA","NA",3],c:["NA",6]},{a:'bar',b:["NA","NA","NA"],c:[]}]; const newArray = dataArr.map(o => { const newObj = {}; for (const key in o) { if (Array.isArray(o[key])) newObj[key] = o[key].filter(s => s !== "NA") else newObj[key] = o[key] } return newObj; }) console.log(newArray) 

for...of對象的條目。 對於每個條目,檢查它是否為數組。 如果是數組過濾器,則分配給新對象。 如果不是,則分配而不進行過濾。 這不會改變原始數組。

 const dataArr = [{"a":"foo","b":[1,2,"NA","NA",3],"c":["NA",6]},{"a":"bar","b":["NA","NA","NA"],"c":[]}] const result = dataArr.map(dataObj => { const filterObject = {}; for (const [key, val] of Object.entries(dataObj)) { filterObject[key] = Array.isArray(val) ? dataObj[key].filter(val => val != 'NA') : val; } return filterObject; }); console.log(result); 

  const dataArr = [{ a: 'foo', b: [1, 2, "NA", "NA", 3], c: ["NA", 6] }, { a: 'bar', b: ["NA", "NA", "NA"], c: [] } ]; const res = dataArr.map((obj) => { for(let i in obj){ if(Array.isArray(obj[i])){ obj[i] = obj[i].filter(el=>el!=="NA") } } return obj; }); console.log('@>res', res) 

我想這將是一個更好的代碼重構,請提供所需的輸出:

dataArr.forEach(object=>{
  for (let value in object){
   let isArr = Object.prototype.toString.call(data) == '[object Array]';
   isArr? object[value] = object[value].filter(val => {return val != "NA"}):null}
 })

暫無
暫無

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

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