2016-06-28 23 views
5

Có cách nào để tách danh sách ImmutableJS thành danh sách nhiều danh sách không? Tôi về cơ bản tìm kiếm một cái gì đó như lodash's chunk nhưng cho danh sách ImmutableJS.Làm thế nào để tách danh sách ImmutableJS thành nhiều danh sách

Tôi có thể chuyển danh sách của mình thành một mảng trước khi chuyển nó sang chunk và chuyển đổi phản hồi thành danh sách ImmutableJS, nhưng tôi đã nói rằng các biến đổi nông không hiệu quả và danh sách của tôi khá lớn.

Cảm ơn bạn, G.

Trả lời

6

Immutable.js không cung cấp nó phải ra khỏi hộp.

Đây là chức năng chia danh sách thành các phần có kích thước bằng nhau. Đoạn cuối cùng có thể nhỏ hơn nếu danh sách không thể chia đều.

function splitIntoChunks(list, chunkSize = 1) { 
    return Immutable.Range(0, list.count(), chunkSize) 
    .map(chunkStart => list.slice(chunkStart, chunkStart + chunkSize)); 
} 

Nó đầu tiên liệt kê các chỉ số trong đó mỗi đoạn nên bắt đầu và sau đó biến đổi danh sách các chỉ số vào một danh sách các lát kéo dài từ mỗi chỉ số để chỉ số cộng thêm đoạn kích thước.

Trông đơn giản và hiệu quả đối với tôi.

0

này chunk chức năng từ chủ đề này dường như làm việc tốt với dữ liệu không thay đổi của tôi ra khỏi hộp.

function chunk(chunkSize, array) { 
    return array.reduce(function(previous, current) { 
     var chunk; 
     if (previous.length === 0 || 
      previous[previous.length -1].length === chunkSize) { 
      chunk = []; // 1 
      previous.push(chunk); // 2 
     } 
     else { 
      chunk = previous[previous.length -1]; // 3 
     } 
     chunk.push(current); // 4 
     return previous; // 5 
    }, []); // 6 
} 

var list = Immutable.fromJS(['something','nothing','anything','hello']) 

console.log(chunk(3,list)) 

Ví dụ: https://jsfiddle.net/lau_chung/c67g7469/2/

0

Tôi vừa mới đi qua vấn đề này quá và tôi giải quyết nó bằng cách viết hàm này:

const getListAsChunks = (list, chunkSize) => { 
    const iterations = Math.ceil(list.count()/chunkSize); 

    return range(0, iterations).reduce((all, item, i) => { 
     const start = i * chunkSize; 
     const end = (i + 1) * chunkSize; 
     return all.push(list.slice(start, end)); 
    }, List()); 
}; 

Sau đó gọi nó như vậy:

const myChunkedList = getListAsChunks(myImmutableList, 5); 

tôi nhập khẩu range từ lodash/rangeList từ immutable Hy vọng điều này sẽ hữu ích.

0

mudash (một trình bao bọc lodash cung cấp hỗ trợ js không thay đổi) cung cấp chunk method. Nó sẽ cung cấp cho bạn những gì bạn cần. Không có biến đổi nào được thực hiện để hiệu suất vẫn cao.

import _ from 'mudash' 
import Immutable from 'immutable' 

const list = Immutable.List([1, 2, 3, 4]) 
_.chunk(list, 2) // List [ List [ 1, 2 ], List [ 3, 4 ] ] 

Tiết lộ đầy đủ, tôi là tác giả của mô-đun mudash.

Các vấn đề liên quan