const products = {
value: {
phone: [],
lamp: [],
car: ["bmw", "toyota", "audi"]
}
};
In the given object I want to iterate and get keys
.
Note that values
are array of strings
.
I'd like to get all keys and if values are not empty arrays I want to combine with keys and return an array with this structure
[
phone,
lamp,
car-bmw,
car-toyota,
car-audi
]
Here is what I did so far, which is not what I want
const products = {
value: {
phone: [],
lamp: [],
car: ["bmw", "toyota", "audi"]
}
};
const mappedProducts = Object.entries(products.value).map(([value, items]) => {
//console.log("value :", value, "items :", items)
if (items.length > 0) {
return {
car: items.map((c) => c)
};
}
});
console.log(mappedProducts);
Any help will be appreciated.
CodePudding user response:
I modified what you did a bit, you can you flatMap
const products = {
value: {
phone: [],
lamp: [],
car: ["bmw", "toyota", "audi"]
}
};
const mappedProducts = Object.entries(products.value).flatMap(([value, items]) => {
//console.log("value :", value, "items :", items)
if (items.length > 0) {
return items.map(item => `${value}-${item}`);
} else {
return [value];
}
});
console.log(mappedProducts);
CodePudding user response:
You can use for in
loop
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.log(newData);
CodePudding user response:
Another solution would be to use Object.keys()
along with map
and concat
to get a merged array with keys and values (if any):
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.log(keys);