如何通过对象数组中的动态键映射获取值?

How to map get values by dynamic key from array of object?

如果可能的话,我想通过 map() 中的动态键获取对象值。

const array = [
  { "ts": 1620988054, "KEY1": 14, "KEY2": 23, "KEY3": 58 },
  { "ts": 1620901654, "KEY1": 46, "KEY2": 34, "KEY3": 42 },
  { "ts": 1620898054, "KEY1": 16, "KEY2": 44, "KEY3": 24 }
];
let data = {};
const arrayOfKeys = [ "KEY1", "KEY2", "KEY3" ];
const keyObject = { "KEY1": "KEY1", "KEY2": "KEY2", "KEY3": "KEY3" };

for (let index = 0; index < arrayOfKeys.length; index++) {
  const key = Object.keys(keyObject)[index];
  data[key] = array.map(({ KEY1 }) => KEY1);
  data[key] = array.map(({ KEY2 }) => KEY2);
  data[key] = array.map(({ KEY3 }) => KEY3);
}

console.log(data);

const array = [
      {"ts":1620988054, "KEY1":14, "KEY2":23, "KEY3":58},
      {"ts":1620901654, "KEY1":46, "KEY2":34, "KEY3":42},
      {"ts":1620898054, "KEY1":16, "KEY2":44, "KEY3":24}];
    
    const data = array.reduce((acc, cur) => { // loop through array
       const {ts, ...rest} = cur; // for each item, isolate ts from the rest
       Object.entries(rest).forEach(([k, v]) => { // loop through the rest
        if (k in acc) acc[k].push(v) // if we already have an array for the key, push the new value to it
        else acc[k] = [v]; // else create a new array with that key/value pair
       });
       return acc
    }, {});
  
    
    
    console.log(data);

如果您想要一个包含与您的键数组相关的键的对象,您可以通过在数组和项目内减少键来减少数组中的项目。

const array = [
  { "ts": 1620988054, "KEY1": 14, "KEY2": 23, "KEY3": 58 },
  { "ts": 1620901654, "KEY1": 46, "KEY2": 34, "KEY3": 42 },
  { "ts": 1620898054, "KEY1": 16, "KEY2": 44, "KEY3": 24 }
];
const arrayOfKeys = [ "KEY1", "KEY2", "KEY3" ];

const data = array.reduce(
  (accOuter, record) => arrayOfKeys
    .reduce((accInner, key) => ({
      ...accInner,
      [key]: record[key]
        ? [...accInner[key], record[key]]
        : accInner[key]
    }),
  accOuter),
  Object.fromEntries(arrayOfKeys.map(key => [ key, [] ])));

console.log(data);
.as-console-wrapper { top: 0; max-height: 100% !important; }