根据数据点的键拆分 javascript 中的数组

Split an array in javascript based on the key for dataPoints

我正在做一个个人项目,我想显示我需要为其准备数据点的图表。 我得到的回复是

{
  "size":[
    {
      "timestamp":"1641329889000",
      "size":12345,
      "fees":123456,
      "cost":168
    },
    {
      "timestamp":"1641387032",
      "size":456789,
      "fees":4567891,
      "cost":249
    },
    {
      "timestamp":"1641435786",
      "size":98765,
      "fees":987654,
      "cost":987
    },
  ]
}

我希望输出应该是这样的

{
  "size":{
    "timestamp": ["1641329889000","1641387032","1641435786"],
    "size": [12345,456789,98765],
    "fees": [123456,4567891,987654],
    "cost": [168,249,987]
  }
}

谁能帮我解决这个问题

let obj = {
  "size":[
    {
      "timestamp":"1641329889000",
      "size":12345,
      "fees":123456,
      "cost":168
    },
    {
      "timestamp":"1641387032",
      "size":456789,
      "fees":4567891,
      "cost":249
    },
    {
      "timestamp":"1641435786",
      "size":98765,
      "fees":987654,
      "cost":987
    },
  ]
}

let timestamps = [];
let sizes = [];
let fees = [];
let costs = [];

obj.size.foreach( ( data ) => {
   timestamps.push( data.timestamp );
   sizes.push( data.size);
   fees.push( data.fees );
   costs.push( data.cost );
}

let size = { timestamp: timestamps, size : sizes, fees : fees, cost : costs }

let outputObj = { size : size };

console.log( outputObj );

当然很简单。 :D

{
 "size":{
    "timestamp": size.map(item => item.timestamp),
    "size": size.map(item => item.size),
    "fees": size.map(item => item.fees),
    "cost": size.map(item => item.cost),
  }
}

使用 .reduce(),您可以使用没有任何硬编码数据点名称的通用函数。

const data={size:[{timestamp:"1641329889000",size:12345,fees:123456,cost:168},{timestamp:"1641387032",size:456789,fees:4567891,cost:249},{timestamp:"1641435786",size:98765,fees:987654,cost:987}]};

const result = data.size.reduce((acc, item) => {
  const keys = Object.keys(item);
  return keys.reduce((keyAcc, key) => ({
    ...keyAcc,
    [key]: acc[key] ? [...acc[key], item[key]] : [item[key]]
  }), {});
}, [])

console.log({ size: result});

将数组项合并到分组数组的对象中是一项经典的 reduce 任务,可以通过通用方式实现(与底层数据结构无关)。

以下实现还使用 Object.entries in order to access each entry's key-value pair directly. It also utilizes the Logical nullish assignment / ??= 运算符来访问或 create/assign 一行代码的数组。

function mergeAndCollectItemEntries(result, item) {
  Object
    // get an item's entry array.
    .entries(item)
    // for each key-value pair ...
    .forEach(([key, value]) => {

      // ... access and/or create a `key` specific array ...
      const groupList = (result[key] ??= []);

      // ... and push `value` into this array.
      groupList.push(value);
    });
  // return the programmatically aggregated merger result.
  return result
}

const sampleData = {
  "size": [{
    "timestamp": "1641329889000",
    "size": 12345,
    "fees": 123456,
    "cost": 168
  }, {
    "timestamp": "1641387032",
    "size": 456789,
    "fees": 4567891,
    "cost": 249
  }, {
    "timestamp": "1641435786",
    "size": 98765,
    "fees": 987654,
    "cost": 987
  }]
};

const mergedData = {
  size: sampleData.size.reduce(mergeAndCollectItemEntries, {})
};
console.log({
  sampleData,
  mergedData,
});
.as-console-wrapper { min-height: 100%!important; top: 0; }

上面的 reducer 函数的实现方式可能略有不同,如下面的示例代码所示...

function mergeAndCollectItemEntries(result, item) {
  return Object
    .entries(item)
    .reduce((merger, [key, value]) => {

      (merger[key] ??= []).push(value);
      return merger;

    }, result);
}

const sampleData = {
  "size": [{
    "timestamp": "1641329889000",
    "size": 12345,
    "fees": 123456,
    "cost": 168
  }, {
    "timestamp": "1641387032",
    "size": 456789,
    "fees": 4567891,
    "cost": 249
  }, {
    "timestamp": "1641435786",
    "size": 98765,
    "fees": 987654,
    "cost": 987
  }]
};

const mergedData = {
  size: sampleData.size.reduce(mergeAndCollectItemEntries, {})
};
console.log({
  sampleData,
  mergedData,
});
.as-console-wrapper { min-height: 100%!important; top: 0; }