如何通过打字稿中的名称属性合并JSON中的数据

时间:2019-07-15 13:35:09

标签: json angular typescript

我正在一个项目上,我需要解析服务器发送的数据。因此,我有一个带有OTA名称的大型JSON,并带有与其链接的数据。这是我的数组:

0: {name: "Airbnb", value: 48}
1: {name: "Booking.com", value: 6}
2: {name: "Air Rental", value: 2}
3: {name: "Airbnb", value: 50}
4: {name: "Booking.com", value: 14}
5: {name: "Air Rental", value: 1}
6: {name: "Airbnb", value: 38}
7: {name: "Air Rental", value: 3}
8: {name: "Booking.com", value: 6}
9: {name: "HomeAway", value: 1}
10: {name: "Airbnb", value: 40}
11: {name: "HomeAway", value: 1}
12: {name: "Booking.com", value: 2}
13: {name: "Air Rental", value: 2}
14: {name: "Airbnb", value: 48}
15: {name: "Booking.com", value: 6}
16: {name: "Air Rental", value: 0}
17: {name: "Airbnb", value: 11}
18: {name: "Air Rental", value: 1}
19: {name: "Airbnb", value: 17}
20: {name: "Booking.com", value: 2}
21: {name: "Air Rental", value: 0}
22: {name: "Airbnb", value: 17}
23: {name: "Booking.com", value: 1}
24: {name: "Misterbnb", value: 2}
25: {name: "Air Rental", value: 2}
26: {name: "Airbnb", value: 43}
27: {name: "Booking.com", value: 23}
28: {name: "Misterbnb", value: 1}
29: {name: "Air Rental", value: 1}
30: {name: "Booking.com", value: 26}
...

例如,您看到多个“ Airbnb”或“ Booking.com”与一个值链接。我只是想知道它们是否是使用与其链接的名称来合并/求和所有这些值的简便方法。

谢谢。

4 个答案:

答案 0 :(得分:3)

我建议使用reduce

示例:

const jsonData = [{
    name: "Airbnb",
    value: 48
  },
  {
    name: "Booking.com",
    value: 6
  },
  {
    name: "Air Rental",
    value: 2
  },
  {
    name: "Airbnb",
    value: 50
  },
  {
    name: "Booking.com",
    value: 14
  },
  {
    name: "Air Rental",
    value: 1
  },
  {
    name: "Airbnb",
    value: 38
  },
  {
    name: "Air Rental",
    value: 3
  },
  {
    name: "Booking.com",
    value: 6
  },
  {
    name: "HomeAway",
    value: 1
  },
  {
    name: "Airbnb",
    value: 40
  },
  {
    name: "HomeAway",
    value: 1
  },
  {
    name: "Booking.com",
    value: 2
  },
  {
    name: "Air Rental",
    value: 2
  },
  {
    name: "Airbnb",
    value: 48
  },
  {
    name: "Booking.com",
    value: 6
  },
  {
    name: "Air Rental",
    value: 0
  },
  {
    name: "Airbnb",
    value: 11
  },
  {
    name: "Air Rental",
    value: 1
  },
  {
    name: "Airbnb",
    value: 17
  },
  {
    name: "Booking.com",
    value: 2
  },
  {
    name: "Air Rental",
    value: 0
  },
  {
    name: "Airbnb",
    value: 17
  },
  {
    name: "Booking.com",
    value: 1
  },
  {
    name: "Misterbnb",
    value: 2
  },
  {
    name: "Air Rental",
    value: 2
  },
  {
    name: "Airbnb",
    value: 43
  },
  {
    name: "Booking.com",
    value: 23
  },
  {
    name: "Misterbnb",
    value: 1
  },
  {
    name: "Air Rental",
    value: 1
  },
  {
    name: "Booking.com",
    value: 26
  },
];

const reducedData = jsonData.reduce((accumulator, currentValue) => {
  if (accumulator[currentValue.name]) {
    accumulator[currentValue.name] += currentValue.value;
  } else {
    accumulator[currentValue.name] = currentValue.value;
  }
  return accumulator;
}, {});

console.log(reducedData);

答案 1 :(得分:1)

您可以使用键入的字典:

const array = [
    {name: "Airbnb", value: 48},
    {name: "Booking.com", value: 6},
    {name: "Air Rental", value: 2},
    {name: "Airbnb", value: 50},
    {name: "Booking.com", value: 14}
];

const result: { [name: string]: number } = {};
for (const entry of array) {
  // Typed dictionary initialization if needed.
  if (!result[entry.name]) {
    result[entry.name] = 0;
  }
  result[entry.name] += entry.value;
}

console.log(result);

或者,如果您需要保持自己的结构,可以执行以下操作:

const array = [
    {name: "Airbnb", value: 48},
    {name: "Booking.com", value: 6},
    {name: "Air Rental", value: 2},
    {name: "Airbnb", value: 50},
    {name: "Booking.com", value: 14}
];

const results: { name: string; value: number }[] = [];
for (const entry of array) {
  const found = results.find(e => e.name == entry.name);
  if (found) {
    found.value += entry.value;
  } else {
    results.push(entry);
  }
}

console.log(results);

答案 2 :(得分:0)

您可以迭代每个元素上的循环并在名称已经存在的情况下合并数字值。

array.forEach(a => {
result[a.name]= (result[a.name] + a.number)  || a.number;
});

或者您可以使用reduce函数以先前的结果迭代数组的每个元素。

result = array.reduce(function (r, a) {
r[a.name] = r[a.name] || [];
r[a.name].push(a.number);
return r;
}, Object.create(null));

答案 3 :(得分:0)

如我的第一条评论所述,带有lodash的示例

this.data = [
      {name: "Airbnb", value: 48},
      {name: "Booking.com", value: 6},
      {name: "Air Rental", value: 2},
      {name: "Airbnb", value: 50},
      {name: "Booking.com", value: 14},
      {name: "Air Rental", value: 1},
      {name: "Airbnb", value: 38},
      {name: "Air Rental", value: 3},
      {name: "Booking.com", value: 6},
      {name: "HomeAway", value: 1},
      {name: "Airbnb", value: 40},
      {name: "HomeAway", value: 1},
      {name: "Booking.com", value: 2},
      {name: "Air Rental", value: 2},
      {name: "Airbnb", value: 48},
      {name: "Booking.com", value: 6},
      {name: "Air Rental", value: 0},
      {name: "Airbnb", value: 11},
      {name: "Air Rental", value: 1},
      {name: "Airbnb", value: 17},
      {name: "Booking.com", value: 2},
      {name: "Air Rental", value: 0},
      {name: "Airbnb", value: 17},
      {name: "Booking.com", value: 1},
      {name: "Misterbnb", value: 2},
      {name: "Air Rental", value: 2},
      {name: "Airbnb", value: 43},
      {name: "Booking.com", value: 23},
      {name: "Misterbnb", value: 1},
      {name: "Air Rental", value: 1},
      {name: "Booking.com", value: 26},
    ];

    const result = _.reduce(this.data, (dataHolder, entry) => {
      if(dataHolder[entry.name]) {
        dataHolder[entry.name] += entry.value;
      } else {
        dataHolder[entry.name] = entry.value;
      }

      return dataHolder
    }, {});

    console.log(result);

打印

{Airbnb: 312, Booking.com: 86, Air Rental: 12, HomeAway: 2…}
Air Rental: 12
Airbnb: 312
Booking.com: 86
HomeAway: 2
Misterbnb: 3
__proto__: Object