2016-04-01 15 views
0

, ben her tekrarında aynı sonucu dizisini kullanabilirsiniz:Özyinelemeli işlevde bir dönüş değerini nasıl paylaşabilirim? Düzenli fonksiyonunda

_.unique = function(array) { 
    var result = []; 

    for (var i = 0; i < array.length; i++) { 
    if (result.indexOf(array[i]) < 0) { 
     result.push(array[i]); 
    } 
    } 

    return result; 
}; 

nasıl aynı şeyi (ve benim sonuç diziye itmeye devam) bir özyinelemeli fonksiyonu ile çalışırken? Bu kullanma

_.unique = function(array) { 

    var result = []; 


    if (array.length === 0) { 
    return result; 
    } else { 
    if (result.indexOf(array[0]) < 0) { 
     result.push(array[0]); 
    } 
    return _.unique(array.slice(1)); 
    } 

    return result; 

}; 

, yanlış çıkışları alıyorum. Bunu iç yardımcı işlevini kullanarak yapabilirim, ama yapmamayı tercih ederim.

+0

Eğer recursions arasında 'result' paylaşmak istiyorsanız, sahip olduğunuz fonksiyonu ile geçmek veya küresel beyan etmek ya:

Bu

bir çalışma kod örneğidir. – ippi

+0

Muhtemelen tail recursion – blade

cevap

1

Sonucu, başka bir işleve iletmeniz gerekir; böylece çağrılan işlev, öğenin benzersiz olup olmadığını bilir. Aşağıdaki kod örneğinde, benzersiz öğelerin dizisi p_result adıyla iletilir.

_.unique = function(array, p_result) { 
    if(!(Object.prototype.toString.call(p_result) == '[object Array]')) p_result = []; 

    var result = p_result; 

    if(array.length === 0) return result; 

    if(p_result.indexOf(array[0]) < 0) { 
     result.push(array[0]); 
    } 

    return _.unique(array.slice(1), result); 
}; 

// e.g. _.unique([0, 1, 1, 2, 3, 7, 4]) gives [0, 1, 2, 3, 7, 4] 

Example fiddle that uses the code above

+0

'u çağırmak istersiniz. Ayrıca, spesifik usecase için bir "_.uniq (array)" fonksiyonunun underscore.js ve lowdash'da zaten mevcut olduğunu belirtmek gerekir. –

+0

OP'nin özyinelemeyi kullanarak çözümü yeniden uygulamak istediğini düşünüyorum. Yinelemeyi kullanırsanız, diziyi bir sonraki işleve benzersiz bir sonuçla iletmeniz gerekir. – Jamie

+0

Evet, tekrarlamayı kullanarak alt çizgi işlevini yeniden uygulamak istiyorum, ancak bu çözüm bana hata mı veriyor? –

İlgili konular