2017-10-10 5 views
0

のように、アレイをクリーンアップするカスタムプロトタイプを作成しました。それは働いていたし、このように見えた:プロトタイプで配列をインプレースで修正する

// given an example array such as this. 
var names = [ 'Lara', 'Lucy', 'Alexa', 'Vanessa', 'Lucy', 'Brianna', 'Sandra' ]; 

Array.prototype.clean_up = function(){ 
    var 
     set = [] 
    ; 
    this.forEach(function(item){ 
     if (set.indexOf(item) === -1) { 
      set.push(item); 
     } 
    }); 

    set.sort(); 

    return set; 
}; 

私の唯一の不満は、私はこのようにそれを呼び出す必要があるということです。

names = names.clean_up(); 

以下のように私はそれを呼び出すことができれば、私はArray.sort()のように、それを好む(Iこれはインプレース実装と呼ばれています)。どうやってそれをすることができますか?

names.clean_up(); 

EDIT:(どうやら、これは回答では、ここではなく所属)

次のように私の現在のソリューションは見えますが、それは少し効果がない感じ。それがよりうまくいくかどうか疑問に思います。 1のための、および他に無効

Array.prototype.clean_up = function(){ 
    var 
     set = [], 
     self = this 
    ; 
    this.forEach(function(item){ 
     if (set.indexOf(item) === -1) { 
      set.push(item); 
     } 
    }); 

    set.sort(); 

    // reset and re-fill. 
    while (this.length > 0) { 
     this.pop(); 
    } 

    set.forEach(function(item){ 
     self.push(item); 
    }); 
}; 

:それはあなたが元の配列を変更しないでくださいmentioned数倍となっています。何故ですか?

Array.sort()のような機能があれば、その言語で実行できることを示しています。一部のの実装は「大丈夫」と思われますか? sort()は大丈夫だがカスタム機能はないのはなぜですか?

答えて

0

アレイに影響を与えたい場合は、アレイから重複してスプライスを探してください。 Array.prototype.indexOfは、現在の要素から検索して複数の括弧を削除するための2番目の引数とともに使用することができます。要素が接合される場合、要素がので、次はスキップされるダウンシャッフルされるので、アレイ上

Array.prototype.clean = function(){ 
 
    // Iterate backwards over array 
 
    this.reduceRight(function(acc, value, index, arr) { 
 
    // If first index of value isn't current index, remove this element 
 
    if (arr.indexOf(value) != index) arr.splice(index, 1); 
 
    }, null); 
 
    // Now sort 
 
    this.sort(); 
 
    // Return for chaining 
 
    return this; 
 
} 
 

 
var arr = 'aztatffgff'.split(''); 
 
console.log(arr.join()); 
 
console.log(arr.clean().join());

の反復転送は動作しません。たとえば、フィルタを使用して配列を作成することはできません。新しい配列をに割り当てることができないからです。です。

reduceRightは、ループのに置き換えることができます。

+0

あなたの頭を包み込むのはちょっと難しいですし、 'reduceRight'では直感的ではありませんが、私がしたいことはまったくあります。ありがとうございました。基本的には、 'splice'を使用することがキーです(私のコードと比較して)。 – WoodrowShigeru

+0

@ WoodrowShigeru-もし* forEachRight *があったらそれを使用します。 ;-) – RobG

関連する問題