使用push方法向对象添加条件

时间:2018-08-23 18:37:43

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

我想知道是否可以在数组push方法中添加条件?我只希望将属性“ 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;

};

4 个答案:

答案 0 :(得分:2)

您可以将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));

答案 1 :(得分:0)

为什么不只是:

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

如果country.provinceCodes不存在,则只需将新对象中的键设置为undefined,这与大多数情况下未设置键一样好。

答案 2 :(得分:0)

无论如何,您都需要一个条件语句。可能会减少代码长度:

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 :(得分:0)

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

var country = {"provinceCodes":0}

console.log("provinceCodes" in country)

console.log("provinceCodes2" in country)

我不知道您的countriesObject,但最简单的方法似乎是使用filter(),并在上面的代码中传递。