为了账号安全,请及时绑定邮箱和手机立即绑定

如何在对象数组上使用 Array.protoype.map() 以根据其值过滤掉某些特定键?

如何在对象数组上使用 Array.protoype.map() 以根据其值过滤掉某些特定键?

侃侃无极 2021-06-08 09:05:30
我有以下对象数组,其中一些特定键的值是字符串或数组。我想按原样获取带有字符串值的键,并从带有数组值的键中删除“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;});上面的代码块按预期工作,但我想要一个更好的、面向未来的解决方案。而且,这看起来也很糟糕。
查看完整描述

3 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

如果您只想更新原始数组,则可以使用forEach. 然后使用循环遍历每个对象的键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)


查看完整回答
反对 回复 2021-06-11
?
精慕HU

TA贡献1845条经验 获得超8个赞

您可以使用嵌套map()filter()

  • 首先map()在主阵列上使用。

  • 然后使用获取每个对象的条目 Object.entries()

  • 然后map()在每个对象的条目上使用。

  • 返回值,因为它是,如果Array.isArrayfalse否则返回阵列的滤波值。

  • 最后用于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)


查看完整回答
反对 回复 2021-06-11
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

用于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);


查看完整回答
反对 回复 2021-06-11
  • 3 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信