2015-07-16 25 views
16

Cách đơn giản nhất để xóa đối tượng khỏi Danh sách dựa trên giá trị của thuộc tính là gì?Xóa đối tượng khỏi danh sách ImmutableJS dựa trên giá trị tài sản

Tôi đang tìm kiếm mức tương đương với $ pull trong MongoDB.

Danh sách của tôi có vẻ đơn giản như thế này:

[{a: '1' , b: '1'},{a: '2' , b: '2'}] 

Và tôi muốn loại bỏ từ mảng các đối tượng với tài sản một bộ để '1'. Trong MongoDB, tôi sẽ làm như sau:

Model.update({_id: getCorrectParentObj},{ $pull: {listIDeleteFrom: { a: '1' } } },(err, result)=>{}); 

Làm cách nào để có kết quả tương tự với ImmutableJS?

+0

Đồng bằng js: 'listIDeleteFrom = listIDeleteFrom.filter (hàm (mục) {return item.a! == 1});' (không chắc chắn về bất biến, do đó chú thích) – tymeJV

Trả lời

-4

Bạn không cần bất biến bất cứ điều gì cụ thể cho điều này, chỉ cần sử dụng JavaScript nguyên mẫu mảng:

var test = [{a: '1' , b: '1'},{a: '2' , b: '2'}]; 

test.map(function(el,idx) { 
    return (el.a == "1") ? idx : -1 
}).filter(function(el) { 
    return el != -1 
}).forEach(function(el) { 
    test.splice(el,1) 
}); 

Kết quả trong:

[ { "a" : "2", "b" : "2" } ] 

Hoặc bạn chỉ có thể nhận được giá trị từ .filter() với một điều kiện đảo ngược:

test.filter(function(el) { 
    return el.a != 1; 
}); 

Điều này thực sự không ảnh hưởng đến mảng "trong đặt ", nhưng bạn luôn có thể" ghi đè lên "với kết quả.

Nếu biến test đã là đối tượng Immutable thì chỉ cần chuyển đổi đối tượng đó trước tiên là .toArray() và quay lại.

20

Bạn có thể chỉ đơn giản là filter danh sách bất biến:

var test = Immutable.List.of(Immutable.Map({a: '1'}), Immutable.Map({a: '2'})); 
test = test.filter(function(item) { return item.get('a') !== '1' }); 

Tuy nhiên, filter trên không trống List sẽ cho kết quả một danh sách không thay đổi khác nhau, do đó bạn có thể muốn kiểm tra sự xuất hiện của {a: 1} đầu tiên:

if (test.some(function(item) { return item.get('a') === '1'; })) { 
    test = test.filter(function(item) { return item.get('a') !== '1' }); 
} 
+7

Sử dụng ['filterNot'] (https://facebook.github.io/immutable-js/docs/#/List/filterNot) thay vì 'filter' sẽ được cho là đẹp hơn một chút. –

-3

có thể bạn có thể thử immutable-data

var immutableData = require("immutable-data") 

var oldArray = [{a: '1' , b: '1'},{a: '2' , b: '2'}] 

var data = immutableData(oldArray) 
var immutableArray = data.pick() 

//modify immutableArray by ordinary javascript method 
var i = 0 
immutableArray.forEach(function(item,index){ 
    if (item.a === '1'){ 
    immutableArray.splice(index-i,1) 
    i++ 
    } 
}) 

var newArray = immutableArray.valueOf() 

console.log(newArray)     // [ { a: '2', b: '2' } ] 
console.log(newArray[0]===oldArray[1]) // true 
+0

Điều này không liên quan; 'bất biến-dữ liệu' không liên quan gì đến Immutable.js. –

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