Добавить условный объект, используя метод push

Мне интересно, есть ли способ добавить условие в методе массива push? Мне бы хотелось, чтобы свойство 'ProvinceCodes' добавлялось к объекту только тогда, когда он существует. Вместо того, чтобы делать это ниже, если / еще... Мне интересно, есть ли более чистый способ?

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;

};

5 ответов

Вы можете использовать объект распространения с оценкой короткого замыкания. Если результат выражения provinceCodes !== undefined является true, короткое замыкание будет оцениваться для объекта, который содержит provinceCodes, а спред добавит свойство provinceCodes к объекту результата. Если не выражение будет оценивать false, false будут отброшены

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

В любом случае вам нужно условное утверждение. Может ли это уменьшить длину кода:

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 })
});

Почему не просто

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

Если country.provinceCodes не существует, то вы просто устанавливаете для этого ключа в новом объекте значение undefined, что также хорошо, как если бы он не был установлен для большинства целей.

Что-то вроде этого?

Создание объекта (var obj = {}), затем установите общие свойства и просто добавив provinceCodes если это заполнить требование.

затем в конце поместите его в массив.

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

var countries = {
  a: { key: 1, name: "USA", provinceCodes: 999 },
  b: { key: 2, name: "Brazil" },
};

console.log(generateCountriesArray(countries))

Чтобы проверить, присутствует какое-то свойство или нет, вы можете использовать в операторе, который возвращает true или false вместо typeof(country.provinceCodes) !== 'undefined'

var country = {"provinceCodes":0}

console.log("provinceCodes" in country)

console.log("provinceCodes2" in country)

Я не знаю твоего countriesObject но самый простой способ - использовать filter() и передать чуть выше кода.

Другие вопросы по тегам