JavaScript harita işlevi neden tanımsız döndürüyor?


116

Benim kodum

 var arr = ['a','b',1];
 var results = arr.map(function(item){
                if(typeof item ==='string'){return item;}  
               });

Bu aşağıdaki sonuçları verir

["a","b",undefined]

Results dizisinde tanımsız olmasını istemiyorum, bunu nasıl yapabilirim?


3
Çünkü dizge olmadıkça hiçbir şey döndürmezsiniz. Bu nedenle, son öğe geri döner undefined. Bir dizge değilse ne döndürmeyi bekliyorsunuz? Boş bir dizge mi?
BenM

2
@BenM eğer bir string değilse hiçbir şeyin döndürülmesini istemiyorum, hatta tanımsız değil.
Akshat Jiwan Sharma

4
Görünüşe göre bunu yapmak için yanlış yöntem kullanıyorum, önerildiği gibi filtre kullanacağım.
Akshat Jiwan Sharma

Bir cevabı kabul etmek isteyebilirsin.
Ikke

3
jQuery.map aslında ortaya çıkan diziye tanımsız ve boş değerleri dahil etmeyecek kadar akıllıdır.
Donald Taylor

Yanıtlar:


181

Öğenin bir dizge olmaması durumunda hiçbir şey iade etmiyorsunuz. Bu durumda işlev, sonuçta gördüğünüz tanımsız değerini döndürür.

Eşleme işlevi bir değeri diğerine eşlemek için kullanılır, ancak aslında bir eşleme işlevinin uygun olmadığı diziyi filtrelemek istediğinize benziyor.

Aslında istediğiniz şey bir filtre işlevidir. Öğeyi ortaya çıkan dizide isteyip istemediğinize bağlı olarak doğru veya yanlış döndüren bir işlevi alır.

var arr = ['a','b',1];
var results = arr.filter(function(item){
    return typeof item ==='string';  
});

2
Ahh ... Bir filtre işlevi olduğunu bilmiyordum, teşekkürler.
Akshat Jiwan Sharma

Bu oldukça mantıklı. Harita yapmıyordum .filter yapıyordum ... Nasıl bildin ?! Oo Teşekkürler ^. ^
DigitalDesignDj

oldukça mantıklı Teşekkürler @Ikke
Malik Khalil

Bir cevap arama çabamı kurtardım. Teşekkürler.
Sophie Zhang

23

Filtre, öğelerin değiştirilmediği bu özel durum için çalışır. Ancak çoğu durumda haritayı kullandığınızda, aktarılan öğelerde bazı değişiklikler yapmak istersiniz.

amacınız buysa, azaltmayı kullanabilirsiniz :

var arr = ['a','b',1];
var results = arr.reduce((results, item) => {
    if (typeof item === 'string') results.push(modify(item)) // modify is a fictitious function that would apply some change to the items in the array
    return results
}, [])

1
Teşekkürler - mapile dizilerle sonuçlanır undefined. filteryalnızca öğeyi döndürür veya döndürmez. bu mükemmel
Zach Smith

15

ES6 filtersivri ok gösterimini desteklediğinden (LINQ gibi):

Böylece tek astar ile kaynatılabilir.

['a','b',1].filter(item => typeof item ==='string');

10

Çözümüm haritadan sonra filtre kullanmak olacaktır.

Bu, her JS veri türünü desteklemelidir.

misal:

const notUndefined = anyValue => typeof anyValue !== 'undefined'    
const noUndefinedList = someList
          .map(// mapping condition)
          .filter(notUndefined); // by doing this, 
                      //you can ensure what's returned is not undefined

8

Yalnızca geçerli öğe a ise bir değer döndürürsünüz string. Belki boş bir dizge atamak aksi halde yeterli olacaktır:

var arr = ['a','b',1];
var results = arr.map(function(item){
    return (typeof item ==='string') ? item : '';  
});

Tabii ki, herhangi bir dize olmayan öğeyi filtrelemek istiyorsanız, kullanmamalısınız map(). Bunun yerine, filter()işlevi kullanmayı düşünmelisiniz .


3
Bir sayı varsa bu boş bir dize döndürür
Prasath K

5
var arr = ['a','b',1];
 var results = arr.filter(function(item){
                if(typeof item ==='string'){return item;}  
               });

3

Aşağıdaki mantık gibi uygulayabilirsiniz. Bir dizi değer istediğinizi varsayalım.

let test = [ {name:'test',lastname:'kumar',age:30},
             {name:'test',lastname:'kumar',age:30},
             {name:'test3',lastname:'kumar',age:47},
             {name:'test',lastname:'kumar',age:28},
             {name:'test4',lastname:'kumar',age:30},
             {name:'test',lastname:'kumar',age:29}]

let result1 = test.map(element => 
              { 
                 if (element.age === 30) 
                 {
                    return element.lastname;
                 }
              }).filter(notUndefined => notUndefined !== undefined);

output : ['kumar','kumar','kumar']
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.