web-dev-qa-db-ja.com

値が存在しない場合にのみ配列にlodashプッシュを使用しますか?

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

Lodashはこのようなことができるはずだと感じています。

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

また、私がAngular.jsを使用していることを指摘する価値があります

*アップデート*

if (!_.includes(scope.index, val)) {
    scope.index.Push(val);
} else {
  _.remove(scope.index, val);
}
50
Max Lynn

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);

または、通常の配列を使い続けたい場合

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);
  }
}

LodashでVanilla JSを使用するのは良い習慣です。依存関係を削除し、コードを強制的に理解させ、多くの場合、パフォーマンスが向上します。

60
floribon

_.unionを使用できます

_.union(scope.index, [val]);
52
Afzal Hossain

おそらく _。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 ]
5
S.D.

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>
2
alexmac

これを行う最も簡単な方法は、_。isEmptyおよび_.remove Lodash関数を使用することです。

if (_.isEmpty(_.remove(array, value)) {
   array.Push(value);
}

削除関数は削除された値または空の配列を返し、空の配列を返す場合、新しい値を追加します。

0
Ilya Lagoshny

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

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>");

実際には、ほとんどの場合役に立たない結果の配列の長さの値を返すため、Pushは嫌いです。関数を連鎖できるように、返される結果の配列への参照が必要です。したがって、それを達成する簡単な方法は次のとおりです。

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>");

したがって、これは合理的にチェーン可能です。

0
Redu

この場合、「concat」を使用してプッシュし、「uniq」を使用して一意の値を検証できます。

例:

var ar = [1, 2, 3, 1, 5, 2, 4]
ar = _.uniq(_.concat(ar, 9))
//[1, 2, 3, 5, 4, 9]

例: https://codepen.io/dieterich/pen/xeZNJY

参照: https://lodash.com/docs/4.17.11#uniq

0

IEをサポートする必要がない場合、またはポリフィルを使用している場合は、 Array.prototype.includes() を使用できます。

const addUniq = (array, value) => array.includes(value) 
  ? array.length 
  : array.Push(value);
0
Rich Howell