2016-05-06 3 views
30

値が存在しない場合は追加されますが、値がある場合は配列からその値も削除したいという配列を作成しようとしています。値が存在しない場合にのみ、lodash pushを配列に使用しますか?

Lodashのような感じは、このようなことができるはずです。

ベストプラクティスの提案に興味があります。

また、それは私がその項目をチェックするためにAngular.js

*更新*

if (!_.includes(scope.index, val)) { 
    scope.index.push(val); 
} else { 
    _.remove(scope.index, val); 
} 
+0

サンプルを使用することができます。プラスあなたが試したもの。 –

+0

現代のJavaScript環境では、配列よりSetを使用する方がはるかに良いでしょう。 – Pointy

答えて

40

ES6によって導入Set機能は、まさにそれを行うだろう。

var s = new Set(); 

// Adding alues 
s.add('hello'); 
s.add('world'); 
s.add('hello'); // already exists 

// Removing values 
s.delete('world'); 

var array = Array.from(s); 

それとも、Lodashの上にバニラJSを使用して、通常の配列

function add(array, value) { 
    if (array.indexOf(value) === -1) { 
    array.push(value); 
    } 
} 

function remove(array, value) { 
    var index = array.indexOf(value); 
    if (index !== -1) { 
    array.splice(index, 1); 
    } 
} 

を使用して保存しておきたい場合は良い習慣です。それは依存関係を取り除き、コードを理解させ、しばしばより効果的です。

+0

セットを使用するサポートは何ですか? –

+0

ちょっと待ってました。 IE11。 https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Set – floribon

+1

add()関数内のコードのように見えるのは間違っています:** array.indexOf(value)!== -1 **は、** array.indexOf(value)=== -1 **でなければなりません。現在のコードロジックは:itemが既に存在する場合 - add。 – Pjotr

1

使用includes機能をされて使用していますが、既存の削除に配列し、removeに存在することを指摘する価値があります項目。

function addOrRemove(arr, val) { 
 
    if (!_.includes(arr, val)) { 
 
    arr.push(val); 
 
    } else { 
 
    _.remove(arr, item => item === val); 
 
    } 
 
    console.log(arr); 
 
} 
 

 
var arr = [1, 2, 3]; 
 
addOrRemove(arr, 1); // arr = [2, 3] 
 
addOrRemove(arr, 4); // arr = [2, 3, 4] 
 
addOrRemove(arr, 2); // arr = [3, 4]
<script src="https://raw.githubusercontent.com/lodash/lodash/4.11.2/dist/lodash.min.js"></script>

+0

私はこの回答が好きですが、私はそれを試してみて、それは私のために働いていないようです。 –

+0

非常にうまく追加されているようですが、関数が再度トリガされた場合は値を削除しません。私はコードスニペットで私の質問を更新しました –

4

おそらく_.pull()は助けることができる:

var _ = require('lodash'); 

function knock(arr,val){ 
    if(arr.length === _.pull(arr,val).length){ 
     arr.push(val); 
    } 
    return arr; 
} 

は、既存の配列を変異させるだけでなく、重複を削除します。

> var arr = [1,2,3,4,4,5]; 

> knock(arr,4); 
[ 1, 2, 3, 5 ] 

> knock(arr,6); 
[ 1, 2, 3, 5, 6 ] 

> knock(arr,6); 
[ 1, 2, 3, 5 ] 
0

この単一のライナーは仕事をする必要があります。挿入する要素が存在しない場合は、要素を挿入し、結果の配列の長さを返します。要素が配列内に存在する場合、要素を削除し、削除された要素を別の配列に返します。

var arr = [1,2,3,4,5], 
 
    aod = (a,e,i=0) => !!~(i = a.indexOf(e)) ? a.splice(i,1) : a.push(e); 
 
    
 
document.write("<pre>" + JSON.stringify(aod(arr,6)) + JSON.stringify(arr) + "</pre>"); 
 
document.write("<pre>" + JSON.stringify(aod(arr,6)) + JSON.stringify(arr) + "</pre>");

それは無駄な時間のほとんどで得られた配列の長さの値を返すので、まあ、実際に私はプッシュを嫌います。関数を連結できるように、返される結果の配列への参照を持つことをお勧めします。したがって、それを達成するための簡単な方法は、

var arr = [1,2,3,4,5], 
 
    aod = (a,e,i=0) => !!~(i = a.indexOf(e)) ? a.splice(i,1) : (a.push(e),a); 
 
     
 
document.write("<pre>" + JSON.stringify(aod(arr,6)) + JSON.stringify(arr) + "</pre>"); 
 
document.write("<pre>" + JSON.stringify(aod(arr,6)) + JSON.stringify(arr) + "</pre>");

だから今、これは合理的に連鎖可能です。

22

あなたは、入力と出力が役立つだろう_.union

_.union(scope.index, [val]); 
関連する問題