【问题标题】:How to map get values by dynamic key from array of object?如何通过对象数组中的动态键映射获取值?
【发布时间】:2021-08-04 14:34:25
【问题描述】:

如果可能,我想通过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);

【问题讨论】:

    标签: javascript array.prototype.map


    【解决方案1】:

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

    【讨论】:

    • 我不是很懂,但还是很懂。
    • 基本上我循环遍历数组的每一项,然后隔离ts 并将所有其他键和值放入rest 变量中。然后我循环遍历rest 并将值放入与键对应的数组中。
    • @DevM 我添加了 cmets。此解决方案是动态的,您无需对键数组进行硬编码
    【解决方案2】:

    如果您想要一个包含与您的键数组相关的键的对象,您可以通过对数组进行归约来归约数组中的项,在项内归约键。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-30
      • 2019-04-11
      • 2019-11-21
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多