2

2 つの配列の対称的な違いを見つけたいと思います。 この実装は機能しますが、一連の配列間の対称的な違いを見つける関数ではなく、2 つの配列のみに固有の関数を書きたいと思います。関数は次のようになります。

function diffArray(arr1, arr2) { }

次に、対称差を含む新しい配列を返します。

これまでの私の最高の試みは

var newArr = [];
    for (var i = 0; i < arr1.length; i++){
      var x = arr[i]; 
    for (var n = 0; n < arr2.length; n++){
      var y = arr2[n];
      if (y === x){
        break;
       } else {
      newArr.push(y);
    }
  }
 }

しかし、私はこれが近いことでさえないことを知っています。質問 (これは FreeCodeCamp のアルゴリズムの問​​題です) は、実装でメソッド array.filter()、array.indexOf()、array.concat()、array.slice() を使用することを示唆しています。一般的な考え方は、配列の 1 つ (私の場合は最初の要素) の各要素を取得し、それを 2 番目の配列のすべての要素と比較することです。一致するものが見つからない場合は、その要素を newArr にプッシュします。

誰もが前述の方法を使用する健全な実装を手伝って、それがどのように機能するかについてしっかりした説明/コメントを提供できますか?

ありがとうございました!

4

4 に答える 4

3

ここに別のアイデアがあります:

function diffArray(arr1, arr2) {
    var newArr = [];

    return arr1.filter(function(val) {
        return arr2.indexOf(val) === -1;
    })
    /*the method above, returns a new array, so you can chain it
          to concat with the array returned from the filter() method
          in the arr2...*/

        .concat(arr2.filter(function(val) {
            return arr1.indexOf(val) === -1;
        }));
}
于 2017-06-10T14:21:07.950 に答える
1

大丈夫。私はそれを解決しましたが、それはまだもっとうまくできると思います。

function diffArray(arr1, arr2) {
  var newArray = [];

  function inArray2(value){
      if(arr2.indexOf(value) == -1){
        return true;
      }
    return false;
  }

  function inArray1(value){
    if(arr1.indexOf(value) == -1){
      return true;
    }
    return false;
  }

  var arr1Filtered = arr1.filter(inArray2);
  var arr2Filtered = arr2.filter(inArray1);

  newArray = arr1Filtered.concat(arr2Filtered);
  return newArray;
}

これはすべてのテストケースに合格したので、すべてのケースで正しいと思います。うわー。

更新:虎三郎からの有用な入力のおかげで、新しく改善されたアルゴリズム。これが、この課題にも立ち往生している人の助けになることを願っています。

function diffArray(arr1, arr2) {
   var newArray = [];

   function notInArray2(value){
       return arr2.indexOf(value) === -1;
   }
   function notInArray1(value){
     return arr1.indexOf(value) === -1;
   }

   var arr1Filtered = arr1.filter(notInArray2);
   var arr2Filtered = arr2.filter(notInArray1);

   newArray = arr1Filtered.concat(arr2Filtered);
   return newArray;
}
于 2016-10-25T01:40:45.443 に答える
0

これは、複数の配列メソッドを組み合わせることで解決できます。

以下のソリューションでは、concat、reduce、および includes を使用しています。

function arrayDifference(arr1, arr2) {
  return arr1
    .concat(arr2)
    .filter(item => !arr1.includes(item) || !arr2.includes(item));
}

console.log(arrayDifference([1, 2, 5], [1, 2, 3, 4, 5, 4])) // [3, 4, 4]
console.log(arrayDifference([1, 2, 5, 4], [1, 2, 3, 4]))    // [5, 3]
于 2021-07-24T17:03:22.307 に答える