web-dev-qa-db-ja.com

lodashを使って配列を比較する(順序のない項目の存在)

私はループを使ってそれができることを知っています、しかし私はこれをする上品な方法を見つけようとしています:

2つの配列があります。

var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];

2つが同じであることを確認するために、lodashを使用したいです。 '同じ'とは、array2に含まれていないitemがarray1にないことを意味します。

これらの項目間の同等性をチェックするという点で:

['a', 'b'] == ['b', 'a'] 

または

['a', 'b'] == ['a', 'b'] 

両方とも文字が正しく並んでいるのでうまくいきます。

前もって感謝します。

82
pQuestions123

外側の配列をソートする場合、内側の配列はすでにソートされているので、 _.isEqual() を使用できます。

var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];
_.isEqual(array1.sort(), array2.sort()); //true

.sort()は配列を変更することに注意してください。それがあなたにとって問題であるならば、(例えば).slice()または拡散演算子(...)を使用して最初にコピーを作成してください。

または、Daniel Budickが以下のコメントで推奨するようにしてください。

_.isEqual(_.sortBy(array1), _.sortBy(array2))

LodashのsortBy()は配列を変更しません。

159
Trott

これにはlodashs xorを使うことができます。

doArraysContainSameElements = _.xor(arr1, arr2).length === 0
6
Stephan Hoyer

「同じ」とは、array2に含まれていないitemがarray1にないことを意味します。

これにはflatten()とdifference()を使用することができます。array2ではないという項目があるかどうかを気にしないのであれば、うまく機能します。 array1にあります。それはあなたが尋ねているように聞こえますarray1はarray2のサブセットです

var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];

function isSubset(source, target) {
    return !_.difference(_.flatten(source), _.flatten(target)).length;
}

isSubset(array1, array2); // → true
array1.Push('d');
isSubset(array1, array2); // → false
isSubset(array2, array1); // → true
6
Adam Boduch

PURE JS(配列とサブ配列に任意の順序で2つ以上の要素がある場合にも機能します)。文字列に,が含まれる場合、文字列では使用されないjoin('-')パラメータ文字として使用します(utfでも構いません)。

array1.map(x=>x.sort()).sort().join() === array2.map(x=>x.sort()).sort().join()
var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['b', 'a']];

var r = array1.map(x=>x.sort()).sort().join() === array2.map(x=>x.sort()).sort().join();

console.log(r);
1

_.difference関数を使用して、違いがあるかどうかを確認できます。

function isSame(arrayOne, arrayTwo) {
   var a = arrayOne,
       b = arrayTwo;

   if (arrayOne.length <= arrayTwo.length) {
      a = arrayTwo;
      b = arrayOne;
      return _.isEmpty(_.difference(a.sort(), b.sort()));
   } else {
      return false;
   }

}

// examples
console.log(isSame([1, 2, 3], [1, 2, 3])); // true
console.log(isSame([1, 2, 4], [1, 2, 3])); // false
console.log(isSame([1, 2], [2, 3, 1])); // false
console.log(isSame([2, 3, 1], [1, 2])); // false

これがお役に立てば幸いです。

0
Amitesh