2 Câu hỏi: Kết hợp và tổng hợp dữ liệu đối tượng json với node.js

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi tạo json sau trong ứng dụng Nút của mình:

    [ { id: 1,
        name: 'user1',
        sport: 'athletics',
        medal_count: '1' 
      },
      { id: 1,
        name: 'user1',
        sport: 'tennis',
        medal_count: '2' 
      },
      { id: 2,
        name: 'user2',
        sport: ['football'],
        medal_count: '2' 
      }
    ]

Bây giờ tôi muốn ghép nối người dùng để chúng xuất hiện dưới dạng một đối tượng với sport được liệt kê trong một mảng và medal_count được tích hợp cho người dùng. Json ở trên sẽ trông như thế này:

    [ { id: 1,
        name: 'user1',
        sport: [
          'athletics',
          'tennis'
        ],
        medal_count: '3' 
      },
      { id: 2,
        name: 'user2',
        sport: 'football',
        medal_count: '2' 
      }
    ]

Làm thế nào được thực hiện? Tôi có đúng không khi nghĩ điều này nên được thực hiện với chức năng thu nhỏ bản đồ?

    
0
2 Câu trả lời                              2                         

Có, bạn đúng:

'use strict';

const data = [{
  id: 1,
  name: 'user1',
  sport: 'athletics',
  medal_count: '1',
},
{
  id: 1,
  name: 'user1',
  sport: 'tennis',
  medal_count: '2',
},
{
  id: 2,
  name: 'user2',
  sport: 'football',
  medal_count: '2',
}];


const out = data.reduce((accumulator, item) => {
  if (accumulator[item.id]) {
    const group = accumulator[item.id];
    if (Array.isArray(group.sport)) {
      group.sport.push(item.sport);
    } else {
      group.sport = [group.sport, item.sport];
    }
    group.medal_count = `${(+group.medal_count) + (+item.medal_count)}`;
  } else {
    accumulator[item.id] = item;
  }
  return accumulator;
}, {});

console.log(JSON.stringify(out, null, 2));

Lưu ý rằng bạn đang sử dụng các số làm chuỗi cho medal_count

    
1
2019-05-08 15: 58: 43Z
  1. Cảm ơn. Làm cách nào để đảm bảo tất cả sport là các mảng và không chỉ các đối tượng có nhiều hơn 1 môn thể thao?
    2019-05-08 19: 23: 59Z
  2. Tôi đã chỉnh sửa mẫu mã để đảm bảo tất cả các đối tượng thể thao là mảng, ngay cả khi chúng chỉ chứa một giá trị. Nếu không, cảm ơn vì sự giúp đỡ.
    2019-05-09 06: 24: 32Z
  3. Vâng, trong trường hợp đó, if(Array.isArray không còn cần thiết nữa
    2019-05-09 07: 09: 18Z
  4. À đúng rồi. Tôi thấy điều này hoạt động: `` `const out = data.reduce ((ắc quy, vật phẩm) = > {if (ắc quy [item.id]) {const nhóm = ắc quy item.sport); group.medal_count = ${(+ group.medal_count) + (+ item.medal_count)};}} {{ ;}, {}); console.log (JSON.opesify (out, null, 2)); `` `
    2019-05-09 07: 15: 50Z

Đã chỉnh sửa

let input = [{
  id: 1,
  name: 'user1',
  sport: 'athletics',
  medal_count: '1'
},
  {
    id: 1,
    name: 'user1',
    sport: 'tennis',
    medal_count: '2'
  },
  {
    id: 2,
    name: 'user2',
    sport: 'football',
    medal_count: '2'
  }
];

let grouped = {};
input.forEach(({id, name, sport, medal_count}) => {
  grouped[id] = grouped[id] || {id, name, sport: [], medal_count:0};
  if (!grouped[id].sport.includes(sport))
    grouped[id].sport.push(sport);
  grouped[id].medal_count = `${(+grouped[id].medal_count)+ (+medal_count)}`;
});
grouped = Object.values(grouped);

console.log(grouped);
    
2
2019-05-08 16: 49: 07Z
nguồn đặt đây