Lodash ile bir öğeyi listeden nasıl kaldırabilirim?


166

Şöyle bir nesne var:

var obj = {
    "objectiveDetailId": 285,
    "objectiveId": 29,
    "number": 1,
    "text": "x",
    "subTopics": [{
        "subTopicId": 1,
        "number": 1
    }, {
        "subTopicId": 2,
        "number": 32
    }, {
        "subTopicId": 3,
        "number": 22
    }]
}
var stToDelete = 2;

Ben var lodashbaşka şeyler için başvurumu yüklü. Kullanmak için etkili bir yol var mı lodash: girişini silmek için {"subTopicId":2, "number":32}gelen objnesne?

Yoksa bunu yapmanın javascript yolu var mı?


1
öğeyi listeden kaldırmak için splice( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ) öğesini kullanabilirsiniz
z33m

1
Bir diziden [1,4,5] 4 kaldırılması bu şekilde yapılamadığı için başlık değiştirildi. Evet, dizilerin karma / nesneden uygulanabileceğini ve muhtemelen var olduğunu anlıyorum, ancak bu ikisinde ince bir fark var. Kullanacağınız bir diziden kaldırmak için result = _.pull(arr, value) Bu, eşleşen tüm değerleri listeden kaldırır.
boatcoder

Yanıtlar:


248

Lyyons Açıklamalarda belirttiği gibi, daha deyimsel ve kullanmak olacaktır Bunu yapmanın lodashy yolu _.removebu gibi

_.remove(obj.subTopics, {
    subTopicId: stToDelete
});

Bunun dışında, geçerli öğenin kaldırılıp kaldırılmayacağını belirlemek için sonucu kullanılacak bir yüklem işlevi iletebilirsiniz.

_.remove(obj.subTopics, function(currentObject) {
    return currentObject.subTopicId === stToDelete;
});

Alternatif olarak, eskisini filtreleyerek yeni bir dizi oluşturabilir _.filterve bunu aynı nesneye atayabilirsiniz.

obj.subTopics = _.filter(obj.subTopics, function(currentObject) {
    return currentObject.subTopicId !== stToDelete;
});

Veya

obj.subTopics = _.filter(obj.subTopics, {subTopicId: stToKeep});

3
Bu cevabın sallanmasının nedeni , tam olarak aradığım şey olan yüklem işlevini kullanabilmenizdir . Eğer ne zaman indeksi, ama ne biliyorsanız unsurunu Çıkarma önemsiz olmayan indeksi biliyoruz?
random_user_name

3
Orijinal diziyi değiştirmek istemiyorsanız _.filter'den bahsetmeye değer olabilir ....
random_user_name

@cale_b Teşekkür ederim :-) Cevabı _.filtersürümle güncelledi.
thefourtheye

7
@thefourtheye _.filter , yüklem doğruysa bir öğe döndürür. Uygulamanız, tutmak istediğinizler yerine tüm istenmeyen öğeleri döndürecektir
Xeltor

5
Aynı yüklemi kullanmak _.rejectyerine @thefourtheye kullanmalısınız _.filter. Daha fazla bilgi için cevabımı kontrol et !
Xeltor

29

Sadece vanilya JS kullanın. spliceÖğeyi kaldırmak için kullanabilirsiniz :

obj.subTopics.splice(1, 1);

gösteri


3
kullanıcı soruyorIs there an efficient way to use _lodash to delete
semirturgay

7
@Andy Haklısın, ama dizin zaten bilinmiyorsa ne olacak?
thefourtheye

3
Dizinizin mutasyona uğratılmasını istiyorsanız splice () en iyi yaklaşımdır. Remove komutunu kullanırsanız, yeni diziyi döndürür ve yeniden atanması gerekir.
omarjebari

Bir öğeyi dizideki dizine göre diziden kaldırmak istiyorsanız (açıkça, kaldırma işlemini bu şekilde gerçekleştirmek istiyorsanız bu dizine sahip olursanız), splice yöntemini kullanmak en verimli (ve kolay) yoldur yapmak için. Hiçbir şeyi karşılaştırmaya ve kodu hatalar ve hatalar için daha karmaşık ve savunmasız hale getirmeye gerek yok ...
TheCuBeMan

26

ile yapabilirsiniz _pull.

_.pull(obj["subTopics"] , {"subTopicId":2, "number":32});

referansı kontrol et


7
Dokümanlar başına, karşılaştırmalar_.pull için katı bir eşitlik kullanır , yani === . İki farklı düz nesne asla eşit olarak ===(veya ==bu konuda) ile karşılaştırılmaz. Böylece yukarıdaki kod dizideki hiçbir öğeyi asla kaldırmaz.
Mark Amery

1
Ancak, dizideki dizelerle çalışan tek kişi budur. _.removesadece diziyi temizler.
Yauheni Prakopchyk

3
Hala bunun doğru cevap olduğunu düşünüyorum. JS .filter eşleşen tüm öğeleri kaldırır, JS .splice dizin biliyorum, _.remove dizinin tüm öğeleri üzerinde yinelenen böylece daha az verimli olur. _.pull tam olarak istediğim şey: _.pull (dizi, itemToRemove).
Judah Gabriel Himango

21

Artık, saklamanız gerekenler yerine kurtulmanız gereken şeylere göre filtrelemenizi sağlayan _.reject özelliğini kullanabilirsiniz .

aksine _.pullveya _.removesadece diziler üzerinde çalışır ._reject, herhangi bir Collection

obj.subTopics = _.reject(obj.subTopics, (o) => {
  return o.number >= 32;
});

2

Bildiğim gibi bunu yapmanın dört yolu var

const array = [{id:1,name:'Jim'},{id:2,name:'Parker'}];
const toDelete = 1;

İlk:

_.reject(array, {id:toDelete})

İkincisi:

_.remove(array, {id:toDelete})

Bu şekilde dizi mutasyona uğrar.

Üçüncüsü:

_.differenceBy(array,[{id:toDelete}],'id')
// If you can get remove item 
// _.differenceWith(array,[removeItem])

Sonuncusu:

_.filter(array,({id})=>id!==toDelete)

Öğreniyorum lodash

Daha sonra bulabilmek için bir kayıt yapmak için cevap verin.


Aradığımreject
Sampgun

2

@Thefourtheye yanıtına ek olarak , geleneksel anonim işlevler yerine yüklem kullanarak :

  _.remove(obj.subTopics, (currentObject) => {
        return currentObject.subTopicId === stToDelete;
    });

VEYA

obj.subTopics = _.filter(obj.subTopics, (currentObject) => {
    return currentObject.subTopicId !== stToDelete;
});

1

lodash ve daktilo

const clearSubTopics = _.filter(obj.subTopics, topic => (!_.isEqual(topic.subTopicId, 2)));
console.log(clearSubTopics);

0

İşte dizi ile basit lodash işlevi ve dizin numarası ile silinmesi.

index_tobe_delete = 1

fruit = [{a: "apple"}, {b: "banana"}, {c: "choco"}]
_.filter(fruit, (value, key)=> {
return (key !== index_tobe_delete)
})
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.