1
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.

3 Answers 3

2

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

Sign up to request clarification or add additional context in comments.

Comments

1

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

Comments

1

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.