2015-05-07 15 views
12

Durumumun iç içe geçmiş bir diziyi içereceği durumlarda find nesnelerinin bir yolunu göremiyorum.İç içe geçmiş dizide eşleme özelliğine göre nesne bul

var modules = [{ 
    name: 'Module1', 
    submodules: [{ 
     name: 'Submodule1', 
     id: 1 
     }, { 
     name: 'Submodule2', 
     id: 2 
     } 
    ] 
    }, { 
    name: 'Module2', 
    submodules: [{ 
     name: 'Submodule1', 
     id: 3 
     }, { 
     name: 'Submodule2', 
     id: 4 
     } 
    ] 
    } 
]; 

submodules bir dizi, bir nesne olduğu için bu çalışmaz. Bu işi yapacak herhangi bir kısa yol var mı? Diziyi el ile yinelemekten kaçınmaya çalışıyorum.

_.where(modules, {submodules:{id:3}}); 

cevap

10

Burada ile geldi ne: flow() kullanma

_.find(modules, _.flow(
    _.property('submodules'), 
    _.partialRight(_.some, { id: 2 }) 
)); 
// → { name: 'Module1', ... } 

, size ne gerek yaptığı bir geri çağırma işlevi oluşturabilirsiniz. Çağrı sırasında, numaralı veri her işlevden akar. İstediğiniz ilk şey, submodules özelliğidir ve property() işlevini kullanarak bunu alabilirsiniz.

Alt modüller dizisi daha sonra, bu durumda, 2 kimliğine sahip olan alt modülü içeriyorsa true değerini döndüren some()'a beslenir.

find()'u, yalnızca birinci olanı değil, birden çok modül arıyorsanız filter() ile değiştirin.

+0

Hoşuma gitti, teşekkürler! Dinamik bir yol kadar zarif değil, ama lodash bunu desteklemiyor. Belki bir karışım yapacağım ... – helion3

+2

FYI, Lodash 4.0'da .any() işlevini kaldırdılar. Şimdi .some() kullanacaksınız. – Justin

0

En iyi şansın, modül elde etmek için bir işlev kullanmak olduğunu düşünüyorum.

_.select(modules, function (module) { 
    return _.any(module.submodules, function (submodule) { 
    return _.where(submodule, {id:3}); 
    }); 
}); 

alt modül

.Where almak için bu deneyin ( .pluck (modülleri, "Alt modüller") {submodules: {id: 3}});

+0

İyi fikir. Ayrıca _flutten kullanmam gerekiyor çünkü '_.pluck' diziler dizisini döndürüyor. – helion3

+0

(Evet, sonradan aklıma geldi), ama cevabımı tamamen değiştirdim çünkü işe yaramayacaktı. umutlu düşünme :) – Mabedan

+1

Ama işe yaradı. Flatten + pluck mantığını kullanarak testim çalışır. http://jsbin.com/howazulexe/1/edit?js – helion3

22

Lodash böyle (diziler dahil) iç içe verilerde filtre sağlar:

_.filter(modules, { submodules: [ { id: 2 } ]});

+2

Aynı sözdizimini '_.find' ile de kullanabilirsiniz. –

+1

Bu, _.filter' filtrelenmiş diziyi veya boş bir diziyi döndürse de, – blak3r

+1

@DevonSams kabul edilmiş yanıt olmalıdır ve '_.find' bir nesne, dizi, sayı, dizi, boole veya undefined olabilecek eşleşen öğeyi döndürür. – mjwatts

İlgili konular