Home > OS >  How to iterate through nested Objects and combine key and value?
How to iterate through nested Objects and combine key and value?

Time:05-06

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