Computer >> Máy Tính >  >> Lập trình >> Javascript

Nhóm các đối tượng dựa trên thuộc tính khóa trong JavaScript

Chúng ta có một parentArray chứa nhiều mảng con có cùng kích thước, mỗi mảng con là mảng đối tượng chứa hai thuộc tính:key và value. Trong một mảng con, người ta khẳng định rằng hai đối tượng không thể có cùng một khóa nhưng tất cả các mảng con đều có cùng một cặp n khóa trong đó n là kích thước của mảng con.

Công việc của chúng ta là chuẩn bị một đối tượng có khóa là khóa của các đối tượng và giá trị là một mảng chứa tất cả các giá trị cho khóa cụ thể đó.

Đây là một mảng mẹ mẫu -

const parentArray = [[
{
   key: 123,
   value: 'India'
}, {
   key: 124,
   value: 'USA'
}, {
   key: 125,
   value: 'Japan'
}, {
   key: 126,
   value: 'Denmark'
}, {
   key: 127,
   value: 'Austria'
},
], [
{
   key: 124,
   value: 'Kenya'
}, {
   key: 126,
   value: 'UK'
}, {
   key: 123,
   value: 'Germany'
}, {
   key: 127,
   value: 'Spain'
}, {
   key: 125,
   value: 'Portugal'
},
]];

Chúng tôi sẽ lặp qua mảng mẹ và sau đó lần lượt tất cả các mảng con và nếu chúng tôi tìm thấy khóa phù hợp, chúng tôi đẩy nó vào mảng giá trị, nếu không, chúng tôi tạo một mảng giá trị mới.

Mã đầy đủ cho điều này sẽ là -

const parentArray = [[
{
   key: 123,
   value: 'India'
}, {
   key: 124,
   value: 'USA'
}, {
   key: 125,
   value: 'Japan'
}, {
   key: 126,
   value: 'Denmark'
}, {
   key: 127,
   value: 'Austria'
},
], [
{
   key: 124,
   value: 'Kenya'
}, {
   key: 126,
   value: 'UK'
}, {
   key: 123,
   value: 'Germany'
}, {
   key: 127,
   value: 'Spain'
}, {
   key: 125,
   value: 'Portugal'
},
]];
const map = {};
parentArray.forEach(arr => {
   arr.forEach(obj => {
      const { key, value } = obj;
      if(map[key]){
         map[key].push(value);
      }else{
         map[key] = [value]
      }
   })
});
console.log(map);

Đầu ra trong bảng điều khiển sẽ là -

{
   '123': [ 'India', 'Germany' ],
   '124': [ 'USA', 'Kenya' ],
   '125': [ 'Japan', 'Portugal' ],
   '126': [ 'Denmark', 'UK' ],
   '127': [ 'Austria', 'Spain' ]
}