UnderscoreJS kullanarak bir öğeyi diziden kaldırma


137

Diyelim ki bu koda sahibim

var arr = [{id: 1, ad: 'a'}, {id: 2, ad: 'b'}, {id: 3, ad: 'c'}];

ve id = 3 olan öğeyi diziden kaldırmak istiyorum. Eklemeden bunu yapmanın bir yolu var mı? Alt çizgi veya benzeri bir şey kullanabilir miyim?

Teşekkürler!


Yeni bir dizi oluşturmak istemiyorsanız, tek seçenek ekleme. Bahis çizgi altını da kullanır (dahili olarak, böyle bir yöntem varsa).
Felix Kling

6
Eklemenin nesi yanlış?
Šime Vidas

Alt çizginin referansını kontrol ettiniz mi?
Šime Vidas

Sadece düz JavaScript kullanarak, bu, nesneleri nesne dizisine göre kaldırma nesnesinin bir kopyasıdır .
Felix Kling

5
underscore.js etiketine sahip olduğu için iyi bir çift değil
Garis M Suero

Yanıtlar:


279

Sadece düz JavaScript kullanarak, bu zaten cevaplandı: Nesneleri nesneden diziye kaldırmak .

Underscore.js kullanarak, birleştirmek olabilir .findWhereile .without:

var arr = [{
  id: 1,
  name: 'a'
}, {
  id: 2,
  name: 'b'
}, {
  id: 3,
  name: 'c'
}];

//substract third
arr = _.without(arr, _.findWhere(arr, {
  id: 3
}));
console.log(arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

Yine de, bu durumda yeni bir dizi oluşturduğunuzdan, basitçe _.filterveya yerel Array.prototype.filterişlevi (tıpkı diğer soruda gösterildiği gibi) kullanabilirsiniz. O zaman burada iki kez potansiyel olarak iki kez yerine dizi üzerinde tekrarlarsınız.

Diziyi yerinde değiştirmek istiyorsanız, kullanmanız gerekir .splice. Bu diğer soruda da gösterilmektedir ve undescore bunun için herhangi bir yararlı işlev sağlamamaktadır.


1
Evet, bu mükemmel çalışıyor, alt çizgi belgelerini gözden geçirdim ama olmadan dışarı çekmek nasıl oldukça anlamadım. Teşekkür ederim!
tırmanış

10
_.Reject veya _.filter () burada çok daha verimli olmaz mıydı? Sadece bir öğeyi çıkarmak için listenin iki yinelemesi ile sonuçlanırsınız.
Rick Strahl

1
Bu bir kopya olabilir ama bu daha iyi bir cevaptır.
Michael J.Calkins

2
@RickStrahl Haklısın. _.rejectburada daha iyi bir seçim gibi görünüyor.
Tarik

1
@lukaserat son eleman pop, kullanın arr.pop()...
Emile Bergeron

96

Alt Çizgi'yi kullanabilirsiniz .filter

    var arr = [{
      id: 1,
      name: 'a'
    }, {
      id: 2,
      name: 'b'
    }, {
      id: 3,
      name: 'c'
    }];

    var filtered = _(arr).filter(function(item) {
         return item.id !== 3
    });

Ayrıca şu şekilde de yazılabilir:

var filtered = arr.filter(function(item) {
    return item.id !== 3
});

var filtered = _.filter(arr, function(item) {
    return item.id !== 3
});

Kemanı Kontrol Et

Ayrıca kullanabilirsiniz .reject


Sanırım demek istediniz: var filtered = _.filter (arr, function (item) {return item.id! == 3});
tbh__

2
@tbh__ _(), koleksiyon çevresinde alt çizgi yöntemlerini çağırmanıza izin verecek bir sarıcı oluşturacaktır.
Sushanth -

Yıllardır alt çizgi kullanıyorum, bunu hiç bilmiyordum. Teşekkürler
tbh__


16

Alt çizgi , özellikle kaldırılacak nesneniz varsa, bir öğeyi bir diziden kaldırmak için mükemmel bir _without () yöntemine sahiptir.

Tüm değerlerin kaldırıldığı dizinin bir kopyasını döndürür.

_.without(["bob", "sam", "fred"], "sam");

=> ["bob", "fred"]

Daha karmaşık nesnelerle de çalışır.

var bob = { Name: "Bob", Age: 35 };
var sam = { Name: "Sam", Age: 19 };
var fred = { Name: "Fred", Age: 50 };

var people = [bob, sam, fred]

_.without(people, sam);

=> [{ Name: "Bob", Age: 35 }, { Name: "Fred", Age: 50 }];

Kaldırılacak öğeniz yoksa, yalnızca bir özelliği, _.findWhereve ardından kullanabilirsiniz _.without.


2
Not: Bu yalnızca sam nesnesini onsuz geçirdiğiniz için çalışır. Bunun yerine { Name: "Sam", Age: 19 }sam değişkeni yerine onsuz geçerseniz , artık çalışmaz. Keman
Adam

5

Dizeleri filtreler ve büyük / küçük harfe duyarlı olmayan filtreler arıyorsanız lütfen dikkatli olun. _.without () büyük / küçük harfe duyarlıdır. Aşağıda gösterildiği gibi _.reject () yöntemini de kullanabilirsiniz.

var arr = ["test","test1","test2"];

var filtered = _.filter(arr, function(arrItem) {
    return arrItem.toLowerCase() !== "TEST".toLowerCase();
});
console.log(filtered);
// ["test1", "test2"]

var filtered1 = _.without(arr,"TEST");
console.log(filtered1);
// ["test", "test1", "test2"]

var filtered2 = _.reject(arr, function(arrItem){ 
    return arrItem.toLowerCase() === "TEST".toLowerCase();
});
console.log(filtered2);
// ["test1", "test2"]

4

Diğer cevaplar dizinin yeni bir kopyasını oluşturur, diziyi yerinde değiştirmek isterseniz kullanabilirsiniz:

arr.splice(_.findIndex(arr, { id: 3 }), 1);

Ancak bu, öğenin her zaman dizinin içinde bulunacağını varsayar (çünkü bulunamazsa yine de son öğeyi kaldıracaktır). Güvende olmak için şunları kullanabilirsiniz:

var index = _.findIndex(arr, { id: 3 });
if (index > -1) {
    arr.splice(index, 1);
}

2

ya da başka bir kullanışlı yol:

_.omit(arr, _.findWhere(arr, {id: 3}));

benim 2 sentim


1
atla çalışır objectve döndürür object. bu nedenle, bir elemanı çıkardıktan sonra geri Arraysalmayı bekleyebileceğimiz yerlerle çalışmak için iyi değildir array.
ScrapCode

1
Yani, _. Olmadan bakıyorsun:_.without([1, 2, 1, 0, 3, 1, 4], 0, 1); => [2, 3, 4]
Nadeem

2

Kullanım kullanabilirsiniz düz JavaScript'in 'ın Array#filterböyle bir yöntem:

var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];

var filteredArr = arr.filter(obj => obj.id != 3);

console.log(filteredArr);

Veya, aşağıdaki gibi kullanım Array#reduceve Array#concatyöntemler:

var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];

var reducedArr = arr.reduce((accumulator, currObj) => {
  return (currObj.id != 3) ? accumulator.concat(currObj) : accumulator;
}, []);

console.log(reducedArr);

NOT:

  • Her ikisi de saf işlevsel yaklaşımdır ( yani mevcut diziyi değiştirmezler).
  • Hayır, bu yaklaşımda harici kütüphane gereklidir (Vanilya JavaScript'i yeterlidir).

0

Bu yöntemi denerdim

_.filter(data, function(d) { return d.name != 'a' });

Kullanıcılar tarafından sağlanan yukarıdaki çözümler gibi daha iyi yöntemler de olabilir


0

Underscore.js Kullanarak

var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];

var resultArr = _.reject(arr,{id:3});

console.log(resultArr);

Sonuç: [{id:1name:'a'},{id:2,name:'c'}]


-1

Underscore'un reddetme yöntemini kullanabilirsiniz, aşağıda belirli bir eşleşmeye sahip dizisi olmayan yeni bir dizi döndürülecektir

arr = _.reject(arr, function(objArr){ return objArr.id == 3; });
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.