从 api 响应中为相同的键和多个值创建映射

问题描述 投票:0回答:2

我收到如下 javascript 响应。我举了一个例子。将会有很多不同的 table_id 具有不同的值。

var a = [{
    table_id: 11111111,
    table_full_name: 'Jin',
    total: '820.001',
    paytable: '220.001',
    name: 'Gross Profit',
    code: 'LSGP'
  },
  {
    table_id: 11111111,
    table_full_name: 'Jin',
    total: '820.001',
    paytable: '300',
    name: 'Profit',
    code: 'LSTR'
  },
  {
    table_id: 11111111,
    table_full_name: 'Jin',
    total: '820.001',
    paytable: '300',
    name: 'Volume',
    code: 'OCVL'
  }
]
let result = []

a.map(y => {
  let index = result.findIndex(x => x.table_id === y.table_id)
  if (index === -1) {
    result.push({
      table_id: y.table_id,
      data: [y.name, y.code]
    })
  } else {
    result[index].data.push(y.kpi_name)
  }
})

console.log(result)

我正在尝试创建一个如下所示的 json 对象。但它没有按要求工作。需要一些帮助

[
{
    "table_full_name":"Jin",
    "total" :"820.001",
    "data":[
        {
            "name":"Gross Profit",
            "code":"LSGP"
        },
        {
            "name":"Profit",
            "code":"LSTR"
        },
        {
            "name":"Volume",
            "code":"OCVL"
        }
    ]
}
]
javascript arrays javascript-objects
2个回答
1
投票

使用

Array::reduce()
收集您的数据和一些对象解构以将您的项目分成多个部分:

var a = [{
    table_id: 11111111,
    table_full_name: 'Jin',
    total: '820.001',
    paytable: '220.001',
    name: 'Gross Profit',
    code: 'LSGP'
  },
  {
    table_id: 11111111,
    table_full_name: 'Jin',
    total: '820.001',
    paytable: '300',
    name: 'Profit',
    code: 'LSTR'
  },
  {
    table_id: 11111111,
    table_full_name: 'Jin',
    total: '820.001',
    paytable: '300',
    name: 'Volume',
    code: 'OCVL'
  }
]
const result = a.reduce((r, {table_id, table_full_name, total, ...data}) => {
  
  const found = r.map.get(table_id);
  if(found){
    found.data.push(data);
    return r;
  }
  
  r.map.set(table_id, r.arr[r.arr.length] = {table_full_name, total, data: [data]});
  return r;
  
}, {arr: [], map: new Map}).arr;

console.log(result)


0
投票

你可以使用

var a = [{
    table_id: 11111111,
    table_full_name: 'Jin',
    total: '820.001',
    paytable: '220.001',
    name: 'Gross Profit',
    code: 'LSGP'
  },
  {
    table_id: 11111111,
    table_full_name: 'Jin',
    total: '820.001',
    paytable: '300',
    name: 'Profit',
    code: 'LSTR'
  },
  {
    table_id: 11111111,
    table_full_name: 'Jin',
    total: '820.001',
    paytable: '300',
    name: 'Volume',
    code: 'OCVL'
  }
];

const result = Object.values(a.reduce((all, y) => {
  const group = all[y.table_id] || {
    table_full_name: y.table_full_name,
    total: y.total,
    data: []
  };
  group.data.push({
    name: y.name,
    code: y.code
  })
  all[y.table_id] = group;
  return all;
}, {}));

console.log(result)

© www.soinside.com 2019 - 2024. All rights reserved.