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

重构基于键/值对值过滤的代码

重构基于键/值对值过滤的代码

慕标5832272 2023-03-24 13:40:34
我有以下代码,它按预期工作 - 它正确地过滤掉值为 null、false 的键/值对,并返回具有其他键/值对的对象。但是,它相当冗长,我想知道是否有办法简化它。const settings = {    distance: null,    length: 23,    weight: null,    isActive: false,    isRound: true}const data = {};Object.entries(settings).filter(([, value]) => value !== null).filter(([, value]) => value !== false).forEach(([key, value]) => (data[key] = value));      console.log(data);
查看完整描述

5 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

您可以删除所有虚假值并只迭代一次:


    const settings = {

        distance: null,

        length: 23,

        weight: null,

        isActive: false,

        isRound: true

    }


    const data = {};

    Object.entries(settings)

      .forEach(([key, value]) => {

        if(!!value) {

          data[key]= value;       

        }

     })

          

    console.log(data);


查看完整回答
反对 回复 2023-03-24
?
largeQ

TA贡献2039条经验 获得超7个赞

在香草 javscript 中,在单个循环中会更容易


const settings = {

    distance: null,

    length: 23,

    weight: null,

    isActive: false,

    isRound: true

}


const data = {}


for(var key in settings) {

    if(settings[key] !== false && settings[key] !== null) {

        data[key] = settings[key];

    }

}

不确定为什么要使用多种过滤方法并减少,因为它会导致额外的迭代。


查看完整回答
反对 回复 2023-03-24
?
繁星点点滴滴

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

使用 reducer 代替你的 怎么样forEach?


const settings = {

    distance: null,

    length: 23,

    weight: null,

    isActive: false,

    isRound: true

}


const data = Object.entries(settings)

  .filter(([, value]) => value !== null && value !== false)

  .reduce((acc, [key, value]) => {

     (acc[key] = value);

     return acc;

  }, {});

      

console.log(data);


查看完整回答
反对 回复 2023-03-24
?
UYOU

TA贡献1878条经验 获得超4个赞

作为替代方案,这里有一些可以说更简单但不是功能性版本,它使用可变性来删除有问题的键:


const settings = {

    distance: null,

    length: 23,

    weight: null,

    isActive: false,

    isRound: true

}


const copy = Object.assign({}, settings);

Object.entries(copy).forEach(([key, value]) => {

  if (value === null || value === false) delete copy[key];

});


console.log(copy);


如果符合您的口味,可短一点。


查看完整回答
反对 回复 2023-03-24
?
MMMHUHU

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

你为什么不在一次迭代中检查这些条件


改变这个


.filter(([, value]) => value !== null)

.filter(([, value]) => value !== false)


.filter(([, value]) => !!value)

或使用单循环检查条件并在数据对象中附加数据,例如:


Object.entries(settings)

      .forEach(([key, value]) => {

        if(!!value) {

          data[key]= value;       

        }

     })


查看完整回答
反对 回复 2023-03-24
  • 5 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

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