Как вернуть массив объектов из многомерного объекта?

#javascript #ecmascript-6

#язык JavaScript #ecmascript-6

Вопрос:

У меня есть объект:

 const salary = {  netto: {  min: '700.',  max: '',  },  brutto: {  min: '',  max: '',  }, }  

Я хочу перебрать объект и вернуть массив объектов, которые будут выглядеть как [{name: 'netto_min', value: '700'},...etc] пропущенные ключи с пустым значением.

Я пытался:

 const result = Object.keys(salary).map(type =gt;   Object.keys(salary[type]).map(entry =gt; {  if(salary[type][entry] !== ''){  return {name: `${type}_${entry}`, value: parseInt(salary[type][entry]).toString()}  }  }) )  

Это заставило меня: [[{name: 'netto_min', value: '700'}, undefined],[undefined, undefined]] Как я могу получить [{name: 'netto_min', value: '700'}] вместо этого?

Комментарии:

1. в значении значения вы задаете значение min ?

2. да, исправил это. Идея состояла в том, чтобы перебрать все значения и, если они присутствуют, вернуть их как часть массива объектов. Но вторая карта создает второй массив, я этого не ожидал, поэтому не уверен, как добиться нужного мне результата.

Ответ №1:

 const salary = {  netto: {  min: "700.",  max: ""  },  brutto: {  min: "",  max: ""  } }; let result = Object.keys(salary).map(k =gt; {  return Object.keys(salary[k]).map(r =gt; ({  name: `${k}_${r}`,  value: parseInt(salary[k][r])  })) }).flat().filter( b =gt; !isNaN(b.value))  

ВОЗВРАТ

 [ { name: 'netto_min', value: 700 } ]  

Я предполагаю , что 700. это была опечатка 700 , которую легко вычеркнуть

Комментарии:

1. Это была не ошибка, это было одно из принятых значений, которое необходимо пройти parseInt

2. @Алена, поняла, обновлено

Ответ №2:

Ты мог бы сделать это:

 const salary = {  netto: {  min: '700.',  max: '',  },  brutto: {  min: '',  max: '',  }, }  let result = []  for (type in salary) {  for (entry in salary[type]) {  let obj = {}  let value = salary[type][entry]   if (value) {  obj.name = `${type}_${entry}`  obj.value = parseInt(value).toString()   result.push(obj)  }  } }  console.log(result) 

Ответ №3:

Я думаю, это то, что тебе нужно. Попробуй вот так:

 const result = [];  Object.entries(salary).map(entry =gt; {  const prefix = entry[0];  const props = Object.entries(entry[1])  .filter(prop =gt; !!prop[1])  .map(prop =gt; ({  name: `${prefix}_${prop[0]}`,  value: prop[1],  }));   result.push(...props); });  

Ответ №4:

Получите ключи, а затем отфильтруйте этот массив по тому, является ли этот ключ непустым. затем выполните итерацию, переместите его в массив и верните.

 const salary = {  netto: {  min: '700.',  max: '',  },  brutto: {  min: '',  max: '',  }, };  var non_empty_salaries = Object.keys(salary).map(name =gt; {  var keys = Object.keys(salary[name]);  var non_empty = keys.filter(key =gt; salary[name][key] != '');  var non_emptys = [];  for (let key of non_empty) {  non_emptys.push({  name: `${name}_${key}`,  value: salary[name][key]  });  }  return non_emptys; }); console.log(non_empty_salaries);