Добавить условный объект, используя метод 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() и передать чуть выше кода.