Как сделать так, чтобы у объекта цикла было много подобных объектов массива

#javascript

#javascript

Вопрос:

У меня есть объект 1, подобный этому

 const object1 = {
  Sheet1: [
    { A: '', B: '', C: '', D: '', E: '' },
    {
      A: 'Cash Report - Processed',
      B: 'Store: 54101   Date: 1/30/2020',
      D: '',
      E: ''
    },
    { A: '', B: '', C: '', D: 'Adj: 00', E: 'Adj: 01' },
  ],
  Sheet2: [ { D: 'a' }, { G: 's' }, { G: 'b' } ]
};
  

Я хочу удалить пустые данные, но у меня проблема, когда я зацикливаю объект 1, я не могу получить ключ к своему коду

 Object.keys(object1).forEach(function(key) {
    console.log(key, object1[key]);
});

  

Я хочу, чтобы данные были такими

  {
  Sheet1: [
    {
      A: 'Cash Report - Processed',
      B: 'Store: 54101   Date: 1/30/2020',

    },
    { D: 'Adj: 00', E: 'Adj: 01' },
  ],
  Sheet2: [ { D: 'a' }, { G: 's' }, { G: 'b' } ]
};
  

Ответ №1:

Вы можете выполнить это с помощью Object.entries и Array.reduce .

 const input = {
  Sheet1: [
    { A: '', B: '', C: '', D: '', E: '' },
    {
      A: 'Cash Report - Processed',
      B: 'Store: 54101   Date: 1/30/2020',
      D: '',
      E: ''
    },
    { A: '', B: '', C: '', D: 'Adj: 00', E: 'Adj: 01' },
  ],
  Sheet2: [ { D: 'a' }, { G: 's' }, { G: 'b' } ]
};

const output = Object.entries(input).reduce((acc, cur) => {
  acc[cur[0]] = cur[1].reduce((curAcc, curVal) => {
    const notNull = Object.entries(curVal).filter(([ key, val ]) => val);
    if (notNull.length > 0) {
      curAcc.push(Object.fromEntries(notNull));
    }
    return curAcc;
  }, []);
  return acc;
}, {});
console.log(output);  

Ответ №2:

Используйте это:

 for(const key in object1){
  const element = object1[key];
  object1[key] = element.map(x => {
    for(const prop in x){
      if(!x[prop]){
        delete x[prop];
      }
    }
    
    return Object.keys(x).length ? x : null
  }).filter(x => !!x);
};
  

Ответ №3:

Используется Object.entries для преобразования объекта в массив пар ключ-значение, манипулирования этими парами, удаления пар с пустым значением, затем преобразования обратно в объект с помощью Object.fromEntries

 const object1 = {
  Sheet1: [
    { A: "", B: "", C: "", D: "", E: "" },
    {
      A: "Cash Report - Processed",
      B: "Store: 54101   Date: 1/30/2020",
      D: "",
      E: "",
    },
    { A: "", B: "", C: "", D: "Adj: 00", E: "Adj: 01" },
  ],
  Sheet2: [{ D: "a" }, { G: "s" }, { G: "b" }],
}

const notEmptyObject = (obj) => Object.keys(obj).length > 0

const removeEmptyValues = (obj) =>
  Object.fromEntries(Object.entries(obj).filter(([_, value]) => Boolean(value)))

const res = Object.fromEntries(
  Object.entries(object1).map(([sheet, data]) => [
    sheet,
    data
      .map(removeEmptyValues)
      .filter(notEmptyObject),
  ])
)

console.log(res)  

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

1. Я не могу думать о преобразовании объекта в массив.. Я просто фокусирую объект, поэтому не могу найти решение, так много, что мне не нравится