【问题标题】:Add conditional to object using push method使用 push 方法向对象添加条件
【发布时间】:2019-01-30 05:10:15
【问题描述】:

我想知道是否有办法在数组推送方法中添加条件?我只希望在对象存在时将属性“provinceCodes”添加到对象中。而不是在下面的 if/else 中执行此操作...我想知道是否有更清洁的方法?

const generateCountriesArray = (countriesObject) => {
const countries = [];
for (var key in countriesObject) {
    var country = countriesObject[key];

    if (typeof(country.provinceCodes) !== 'undefined')
    {
        countries.push({
            value: key,
            name: country.name,
            provinceCodes: country.provinceCodes
        });
    }
    else
    {
        countries.push({
            value: key,
            name: country.name
        });
    }
}
return countries;

};

【问题讨论】:

    标签: javascript object ecmascript-6 push for-in-loop


    【解决方案1】:

    您可以将object spreadshort-circuit evaluation 一起使用。如果表达式provinceCodes !== undefined 的结果是true,则短路将评估包含provinceCodes 的对象,并且展开将属性provinceCodes 添加到结果对象。如果不是,则表达式将评估为falsefalse 将被丢弃。

    const generateCountriesArray = (countriesObject) => {
      const countries = [];
      for (var k in countriesObject) {
        var { key, name, provinceCodes } = countriesObject[k];
    
        countries.push({
          value: key,
          name,
          ...provinceCodes !== undefined && { provinceCodes }
        });
      }
      return countries;
    };
    
    
    const countriesObject = {
      a: { key: 1, name: 1, provinceCodes: 1 },
      b: { key: 2, name: 2 },
    };
    
    console.log(generateCountriesArray(countriesObject));

    【讨论】:

    • 谢谢 Ori。很好的答案! :)
    【解决方案2】:

    无论如何,你需要一个条件语句。可能这样可以减少代码长度:

    const generateCountriesArray = (countriesObject) => {
        const countries = [];
        
        for (var key in countriesObject) {
            var country = countriesObject[key];
            
            var newObject = {
                value: key,
                name: country.name
            };
            
            if (country.provinceCodes !== 'undefined') {
                newObject.provinceCodes = country.provinceCodes;
            }
            
            countries.push(newObject);
        }
        
        return countries;
    }

    我还看到你使用的是const,所以也许你可以使用 ES6 语法,例如

    const generateCountriesArray = countriesObject => countriesObject.map((country, key) => {
        const newObject = {
            value: key,
            name: country.name
        };
            
        if (country.provinceCodes !== 'undefined') {
            newObject.provinceCodes = country.provinceCodes;
        }
        
        return newObject;
    });

    另一个问题,你真的需要做这样的检查吗?在大多数情况下,您只需留下密钥undefined。在这种情况下,ES6 代码将如下所示:

    const generateCountriesArray = countriesObject => countriesObject.map((country, key) => ({
        value: key,
        name: country.name,
        provinceCodes: country.provinceCodes, // here the key migth be undefined
    });

    但如果你真的想从新对象中排除未定义的键,试试这个

    const generateCountriesArray = countriesObject => countriesObject.map((country, key) => ({
        value: key,
        name: country.name,
        ...(country.provinceCodes !== undefined && { provinceCodes: country.provinceCodes })
    });
    

    【讨论】:

      【解决方案3】:

      为什么不只是:

      countries.push({
          value: key,
          name: country.name,
          provinceCodes: country.provinceCodes
      });
      

      如果 country.provinceCodes 不存在,那么您只是将新对象中的该键设置为未定义,这与在大多数情况下不设置它一样好。

      【讨论】:

        【解决方案4】:

        要检查某些属性是否存在,您可以使用返回 truefalsein 运算符而不是 typeof(country.provinceCodes) !== 'undefined'

        var country = {"provinceCodes":0}
        
        console.log("provinceCodes" in country)
        
        console.log("provinceCodes2" in country)

        我不知道你的countriesObject,但最简单的方法似乎是使用filter(),然后通过上面的代码。

        【讨论】:

          猜你喜欢
          • 2011-11-07
          • 2013-01-18
          • 2013-09-23
          • 2023-03-10
          • 1970-01-01
          • 2016-02-03
          • 2010-12-25
          • 1970-01-01
          相关资源
          最近更新 更多