[英]Filter out array of objects by specific values and keys defined in another array
[英]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.isArray
為false
, Array.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.