const products = {
value: {
phone: [],
lamp: [],
car: ["bmw", "toyota", "audi"]
}
};
В данном объекте я хочу повторить и получить keys
.
Обратите внимание, что values
есть array of strings
.
Я хотел бы получить все ключи, и если значения не являются пустыми массивами, я хочу объединить их с ключами и вернуть массив с этой структурой
[
phone,
lamp,
car-bmw,
car-toyota,
car-audi
]
Вот что я сделал до сих пор, чего я не хочу
const products = {
value: {
phone: [],
lamp: [],
car: ["bmw", "toyota", "audi"]
}
};
const mappedProducts = Object.entries(products.value).map(([value, items]) => {
//console.info("value :", value, "items :", items)
if (items.length > 0) {
return {
car: items.map((c) => c)
};
}
});
console.info(mappedProducts);
Любая помощь будет оценена.
Вы можете использовать цикл for in
const products = {
value: {
phone: [],
lamp: [],
car: ["bmw", "toyota", "audi"]
}
};
const newData = [];
for (const key in products) {
const value = products[key];
for (const innerKey in value) {
const innerVal = value[innerKey];
if (innerVal.length > 0) {
innerVal.forEach((item) => newData.push(`${innerKey}-${item}`));
} else {
newData.push(innerKey);
}
}
}
console.info(newData);
Другим решением было бы использовать Object.keys()
вместе с map
и concat
для получения объединенного массива с ключами и значениями (если они есть):
const products = {
value: {
phone: [],
lamp: [],
car: ["bmw", "toyota", "audi"]
}
};
let keys = [].concat.apply([], Object.keys(products.value).map((key) =>{
if (products.value[key].length > 0){
return products.value[key];
}
else return key;
}));
console.info(keys);
Я немного изменил то, что вы сделали, вы можете flatMap
const products = {
value: {
phone: [],
lamp: [],
car: ["bmw", "toyota", "audi"]
}
};
const mappedProducts = Object.entries(products.value).flatMap(([value, items]) => {
//console.info("value :", value, "items :", items)
if (items.length > 0) {
return items.map(item => `${value}-${item}`);
} else {
return [value];
}
});
console.info(mappedProducts);