【问题标题】:JSON separate object to new objects if array's length is longer than 1如果数组的长度大于 1,则 JSON 将对象与新对象分开
【发布时间】:2020-06-15 12:39:04
【问题描述】:

编辑:如果 JSON 中有更多对象,则答案不起作用:/ 如果您能再看一次,我将不胜感激。

我正在尝试分离 JSON 数组以使用单个数组创建新对象。

const objs = [{
  id: ["18772729849", "17773133341", "17773173696"],
  o: 552750,
  g: 2,
  p: 5427.37,
  f: ["0.07480893", "0.07703563", "0.07160716"],
  b: ["76561198311594977", "76561198311424548", "76561198312084911"],
  d: ["uYEY1BQ", "jSdgIK5", "lldBCJt"],
},
{
  id: ["5122519", "7125125", "124124"],
  o: 12440,
  g: 412,
  p: 4124,
  f: ["0.033", "0.0123", "0.412412"],
  b: ["76561198124421421", "712412441248", "71241244911"],
  d: ["uYasdasd1BQ", "jSasdasdK5", "llfasCJt"],
}
];

我的输出应该是这样的:

[{
  id: ['18772729849'],
  o: 552750,
  g: 2,
  p: 5427.37,
  f: ['0.07480893'],
  b: ['76561198311594977'],
  d: ['uYEY1BQ']
},
{
  id: ['17773133341'],
  o: 552750,
  g: 2,
  p: 5427.37,
  f: ['0.07703563'],
  b: ['76561198311424548'],
  d: ['jSdgIK5']
},
{
  id: ['17773173696'],
  o: 552750,
  g: 2,
  p: 5427.37,
  f: ['0.07160716'],
  b: ['76561198312084911'],
  d: ['lldBCJt5']
},
{
  id: ['5122519'],
  o: 12440,
  g: 412,
  p: 4124,
  f: ['0.033'],
  b: ['76561198124421421'],
  d: ['uYasdasd1BQ']
},
{
  id: ['7125125'],
  o: 12440,
  g: 412,
  p: 4124,
  f: ['0.0123'],
  b: ['712412441248'],
  d: ['jSasdasdK5']
},
ETC

所以“o”、“g”、“p”与原始对象中的相同。

解决方案:

const objs = [{ id: ["18772729849", "17773133341", "17773173696"], o: 552750, g: 2, p: 5427.37, f: ["0.07480893", "0.07703563", "0.07160716"], b: ["76561198311594977", "76561198311424548", "76561198312084911"], d: ["uYEY1BQ", "jSdgIK5", "lldBCJt"],},{ id: ["5122519", "7125125", "124124"], o: 12440, g: 412, p: 4124, f: ["0.033", "0.0123", "0.412412"], b: ["76561198124421421", "712412441248", "71241244911"], d: ["uYasdasd1BQ", "jSasdasdK5", "llfasCJt"]}];

var result = objs.flatMap(obj=>{
  return Array.from({length:obj.id.length},(_,i)=>Object.fromEntries(
  Object.entries(obj).map(([key, val])=>[key, Array.isArray(val) ? [val[i]] : val])
  ));
});

console.log(result);

【问题讨论】:

  • 你能参考一些你迄今为止尝试过的源代码吗?

标签: javascript node.js arrays json


【解决方案1】:

您可以通过映射它来获取键值对的fromEntries,并根据id属性的长度生成新的数组,您可以使用Array.from。这是我的尝试:

const objs = [{ id: ["18772729849", "17773133341", "17773173696"], o: 552750, g: 2, p: 5427.37, f: ["0.07480893", "0.07703563", "0.07160716"], b: ["76561198311594977", "76561198311424548", "76561198312084911"], d: ["uYEY1BQ", "jSdgIK5", "lldBCJt"],},{ id: ["5122519", "7125125", "124124"], o: 12440, g: 412, p: 4124, f: ["0.033", "0.0123", "0.412412"], b: ["76561198124421421", "712412441248", "71241244911"], d: ["uYasdasd1BQ", "jSasdasdK5", "llfasCJt"]}];

var result = objs.flatMap(obj=>{
  return Array.from({length:obj.id.length},(_,i)=>Object.fromEntries(
  Object.entries(obj).map(([key, val])=>[key, Array.isArray(val) ? [val[i]] : val])
  ));
});

console.log(result);

【讨论】:

  • 我更新了这个问题,因为它没有用,所以如果你能再看一次,我将不胜感激。
  • @xGPlayer 更新了我的答案,看看,如果这是你需要的,请告诉我。另外我在这里使用了flatMap 来展平数据,您也可以只使用map,这取决于您的要求。
【解决方案2】:

其实只需要.map()

let data = {
  id: [ '18772729849', '17773133341', '17773173696' ],
  o: 552750,
  g: 2,
  p: 5427.37,
  f: [ '0.07480893', '0.07703563', '0.07160716' ],
  b: [ '76561198311594977', '76561198311424548', '76561198312084911' ],
  d: [ 'uYEY1BQ', 'jSdgIK5', 'lldBCJt' ]
}

let result = data.id.map((el,i) => {
   return {
      id: [el],
      o: data.o,
      g: data.g,
      p: data.p,
      f: [data.f[i]],
      b: [data.b[i]],
      d: [data.d[i]]
   }
})

console.log(result);

【讨论】:

  • 我更新了这个问题,因为它没有用,所以如果你能再看一次,我将不胜感激。
【解决方案3】:

您可以找出具有最大长度的数组,然后根据该数组生成您的对象数组。

const objs = [{
      id: ["18772729849", "17773133341", "17773173696"],
      o: 552750,
      g: 2,
      p: 5427.37,
      f: ["0.07480893", "0.07703563", "0.07160716"],
      b: ["76561198311594977", "76561198311424548", "76561198312084911"],
      d: ["uYEY1BQ", "jSdgIK5", "lldBCJt"],
    },
    {
      id: ["5122519", "7125125", "124124"],
      o: 12440,
      g: 412,
      p: 4124,
      f: ["0.033", "0.0123", "0.412412"],
      b: ["76561198124421421", "712412441248", "71241244911"],
      d: ["uYasdasd1BQ", "jSasdasdK5", "llfasCJt"],
    }
  ],
  output = objs.map(o => {
    const length = Object.keys(o).reduce((r, k) => {
      if (Array.isArray(o[k])) {
        r = o[k].length > r ? o[k].length : r;
      }
      return r;
    }, 0);
    return Array.from({
      length
    }, (_, i) => {
      return Object.keys(o).reduce((r, k) => {
        r[k] = Array.isArray(o[k]) ? [o[k][i] || ''] : o[k];
        return r;
      }, {});
    });
  })
  .flat();
console.log(output);

【讨论】:

  • 如果 var obj 实际上是一个数组并且其中有多个对象,如何更改代码使其工作?
  • 我更新了这个问题,因为它没有用,所以如果你能再看一次,我将不胜感激。
【解决方案4】:

使用Object.entriesmap

const process = (arr) => {
  const output = [];
  arr.forEach((obj) => {
    obj.id.forEach((_, i) => {
      output.push(
        Object.fromEntries(
          Object.entries(obj).map(([key, value]) => [
            key,
            Array.isArray(value) ? [value[i]] : value,
          ])
        )
      );
    });
  });
  return output;
};

const objs = [
  {
    id: ["18772729849", "17773133341", "17773173696"],
    o: 552750,
    g: 2,
    p: 5427.37,
    f: ["0.07480893", "0.07703563", "0.07160716"],
    b: ["76561198311594977", "76561198311424548", "76561198312084911"],
    d: ["uYEY1BQ", "jSdgIK5", "lldBCJt"],
  },
  {
    id: ["5122519", "7125125", "124124"],
    o: 12440,
    g: 412,
    p: 4124,
    f: ["0.033", "0.0123", "0.412412"],
    b: ["76561198124421421", "712412441248", "71241244911"],
    d: ["uYasdasd1BQ", "jSasdasdK5", "llfasCJt"],
  },
];

console.log(process(objs));

【讨论】:

  • 如果 var obj 实际上是一个数组并且其中有多个对象,如何更改代码使其工作?
  • @xGPlayer,刚刚更新了答案。只需在对象数组上使用地图。
  • 有些不正确。我将更新帖子,以便您了解我的意思
猜你喜欢
  • 1970-01-01
  • 2021-11-11
  • 2011-08-01
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 2019-12-06
  • 2023-02-08
  • 2020-11-29
相关资源
最近更新 更多