Hợp nhất mảng thành một mảng sau khi lọc


14

Tôi đã có mảng các đối tượng, trong đó tôi chỉ lấy mảng vị trí. Mục tiêu của tôi là hợp nhất các mảng vị trí này thành một mảng, tuy nhiên tôi không làm như vậy và nhận được mảng trống. Đây là cách tôi làm điều đó:

let results = [{
    id: '1',
    locations: ['aaaa', 'bbbbbb', 'cccccc']
  },
  {
    id: '2',
    locations: []
  },
  {
    id: '3',
    locations: ['ddd', 'aaadsad', 'sefd']
  },
  {
    id: '4',
    locations: ['ffff', 'eeee', 'sfdsfsd']
  },
];
const locationIds = [].concat.apply([], ...results.filter(s => s.locations && s.locations.length > 0).map(({
  locations
}) => ({
  locations
})));

console.log(locationIds);

tôi đang làm gì sai ở đây? Kết quả phải là ['aaaa', 'bbbbbb', 'cccccc', 'ddd', 'aaadsad', 'sefd', 'ffff', 'eeee', 'sfdsfsd'];

Câu trả lời:


9

Bạn không cần filterở đây. Chỉ cần sử dụng mapphương thức bằng cách chuyển một hàm gọi lại được cung cấp cho mọi mục trên mảng.

let results = [{ id: '1', locations: ['aaaa', 'bbbbbb', 'cccccc'] }, { id: '2', locations: [] }, { id: '3', locations: ['ddd', 'aaadsad', 'sefd'] }, { id: '4', locations: ['ffff', 'eeee', 'sfdsfsd'] }, ];

const locationIds = [].concat(...results.map(s => s.locations));

console.log(locationIds);


1
@ user122222, bạn được chào đón! Bạn có thể tạo triển khai của riêng mình flatMapgiống như ở đây: stackoverflow.com/questions/39837678/ trên
Mihai Alexandru-

7

Bạn có thể thử với flatMap():

Các flatMap()phương pháp đầu tiên bản đồ mỗi phần tử sử dụng một chức năng lập bản đồ, sau đó flattens kết quả vào một mảng mới. Nó giống như một map()tiếp theo là một flat()số sâu 1 , nhưng flatMap()thường là khá hữu ích, như việc sáp nhập cả vào một phương pháp là hơi hiệu quả hơn.

let results = [{
    id: '1',
    locations: ['aaaa', 'bbbbbb', 'cccccc']
  },
  {
    id: '2',
    locations: []
  },
  {
    id: '3',
    locations: ['ddd', 'aaadsad', 'sefd']
  },
  {
    id: '4',
    locations: ['ffff', 'eeee', 'sfdsfsd']
  },
];
const locationIds = results.flatMap(i => i.locations);
console.log(locationIds);


6

Bạn có thể taka a Array#flatMapvới tài sản mong muốn. Nếu thuộc tính không được cung cấp, thêm một mảng mặc định || [].

let results = [{ id: '1', locations: ['aaaa', 'bbbbbb', 'cccccc'] }, { id: '2', locations: [] }, { id: '3', locations: ['ddd', 'aaadsad', 'sefd'] }, { id: '4', locations: ['ffff', 'eeee', 'sfdsfsd'] }],
    locationIds = results.flatMap(({ locations }) => locations);

console.log(locationIds);
.as-console-wrapper { max-height: 100% !important; top: 0; }


2
Thật tốt khi đề cập đến .flatMap không hoạt động trong Edge và IE mà không có polyfill.
Zydnar

3

Cũng có thể giải quyết bằng cách sử dụng hàm Giảm từ Array.prototype.

var newResults = results.reduce(function(acc, curr) {
    return acc.concat(curr.locations)
  },[]
)

hi vọng điêu nay co ich


2

Tôi đã dành quá nhiều thời gian cho việc này để không đăng giải pháp của riêng mình - câu đố thú vị cho tôi, mặc dù các câu trả lời khác chắc chắn là hiệu quả hơn và dễ đọc hơn. Nó sử dụng cùng một loại chiến lược như bài viết gốc của bạn, điều này có thể giúp chỉ ra nó đã sai ở đâu.

const locationIds = [].concat
                    .apply([], results.filter(result => 
                    result.locations && result.locations.length > 0)
                    .map(result => { return result.locations }));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.