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

Bộ lọc bộ sưu tập lồng nhau với JavaScript

Giả sử, chúng ta có một mảng các đối tượng lồng nhau như thế này -

const arr = [{
   id: 1,
   legs:[{
      carrierName:'Pegasus'
   }]
},
{
   id: 2,
   legs:[{
      carrierName: 'SunExpress'
   },
   {
      carrierName: 'SunExpress'
   }]
},
{
   id: 3,
   legs:[{
      carrierName: 'Pegasus'
   },
   {
      carrierName: 'SunExpress'
   }]
}];

Chúng tôi được yêu cầu viết một hàm JavaScript lấy một mảng như vậy làm đối số đầu tiên và một chuỗi truy vấn tìm kiếm làm đối số thứ hai.

Hàm của chúng ta nên lọc mảng để chỉ chứa những đối tượng có giá trị thuộc tính "tên nhà cung cấp dịch vụ" bằng cùng giá trị được chỉ định bởi đối số thứ hai.

Nếu đối với mảng trên, đối số thứ hai là "Pegasus". Sau đó, đầu ra sẽ giống như -

const output = [{
   id: 1,
   legs:[{
      carrierName:'Pegasus'
   }]
},
{
   id: 3,
   legs:[{
      carrierName: 'Pegasus'
   },
   {
      carrierName: 'SunExpress'
   }]
}];

Ví dụ

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

const arr = [{
   id: 1,
   legs:[{
      carrierName:'Pegasus'
   }]
},
{
   id: 2,
   legs:[{
      carrierName: 'SunExpress'
   },
   {
      carrierName: 'SunExpress'
   }]
},
{
   id: 3,
   legs:[{
      carrierName: 'Pegasus'
   },
   {
      carrierName: 'SunExpress'
   }]
}];
const keys = ['Pegasus'];
const filterByKeys = (arr = [], keys = []) => {
   const res = arr.filter(function(item) {
      const thisObj = this;
      return item.legs.some(leg => {
         return thisObj[leg.carrierName];
      });
   }, keys.reduce((acc, val) => {
      acc[val] = true;
      return acc;
   }, Object.create(null)));
   return res;
}
console.log(JSON.stringify(filterByKeys(arr, keys), undefined, 4));

Đầu ra

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

[
   {
      "id": 1,
      "legs": [
         {
            "carrierName": "Pegasus"
         }
      ]
   },
   {
      "id": 3,
      "legs": [
         {
            "carrierName": "Pegasus"
         },
         {
            "carrierName": "SunExpress"
         }
      ]
   }
]