Изменение формы объекта dataset на основе массива ключей

#javascript #arrays #object

#javascript #массивы #объект

Вопрос:

Предположим, у меня есть:

 const KEYS = ['b', 'a', 'c']
const obj = {
  2018: {a: 1, b: 2, c: 3},
  2019: {a: 4, b: 5, c: 6},
  2020: {a: 7, b: 8, c: 9},
}
  

Это то, что я хотел бы получить:

 const result = {
 2018: { 
    a: [0, 1, 0], 
    b: [2, 0, 0], 
    c: [0, 0, 3] 
  },
 2019: { 
    a: [0, 4, 0], 
    b: [5, 0, 0], 
    c: [0, 0, 6] 
  },,
 2020: { 
    a: [0, 7, 0], 
    b: [8, 0, 0], 
    c: [0, 0, 9] 
  },
}
  

результат [‘2018’] объект имеет три ключа. Каждое значение ключа представляет собой массив, содержащий значения в порядке, который задается КЛЮЧАМИ, использующими 0 в качестве значения заполнения.

Как я могу сделать что-то подобное? Это то, что я пробовал, но, очевидно, сложнее, чем это:

 const reshaped = Object.entries(obj).map(([key, value]) => {
  return { [key]: Object.values(value) }
})

// [
//  { 2018: [ 1, 2, 3 ] },
//  { 2019: [ 4, 5, 6 ] },
//  { 2020: [ 7, 8, 9 ] }
// ]
  

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

1. @Dai отредактируйте основное сообщение, извините

2. Вы написали «Каждое ключевое значение представляет собой массив, содержащий значения в порядке, который задается КЛЮЧАМИ, использующими 0 в качестве значения заполнения». — Я не понимаю, что вы имеете в виду. Пожалуйста, опубликуйте подробное объяснение того, как генерируется желаемый результат (использование простого английского языка подходит) — из того, что вы опубликовали, я не понимаю, как KEYS это должно использоваться.

Ответ №1:

Вы можете сопоставить нужные ключи, чтобы построить массив для каждого свойства.

 const
    KEYS = ['b', 'a', 'c'],
    object = { 2018: { a: 1, b: 2, c: 3 }, 2019: { a: 4, b: 5, c: 6 }, 2020: { a: 7, b: 8, c: 9 } },
    result = Object.fromEntries(Object.entries(object).map(([k, o]) => [
        k,
        Object.fromEntries(Object.entries(o).map(([l, v]) => [
            l,
            KEYS.map(m => l === m ? v : 0)
        ]))
    ]));
    
console.log(result);  
 .as-console-wrapper { max-height: 100% !important; top: 0; }  

Ответ №2:

Вы можете использовать комбинацию Object.entries и Object.fromEntries для сопоставления объекта, а затем просто создать новый массив с длиной КЛЮЧЕЙ arr .

 const KEYS = ['b', 'a', 'c']
const obj = {
  2018: {a: 1, b: 2, c: 3},
  2019: {a: 4, b: 5, c: 6},
  2020: {a: 7, b: 8, c: 9},
}

const result = Object.fromEntries( // Create obj from array of entries
  Object.entries(obj).map(([key, value]) => [ // create array of entries from obj and map it
    key,
    Object.fromEntries( // do the same obj/arr transformation on the value
      Object.entries(value).map(([subKey, subValue]) => {
        const arr = new Array(KEYS.length).fill(0); // create new array of keys length and fill all zeroes
        arr[KEYS.indexOf(subKey)] = subValue; // on the index of the key in the KEYS arr, set the value of the key

        return [subKey, arr]; // return subValue
      })
    )
  ])
);

console.log(result);