115

2 つの配列があり、2 つを比較して、一致する値のみを返すことができるようにしたいと考えています。たとえば、両方の配列に値catがあるため、それが返されます。私はこのようなものを見つけていません。類似点を返す最良の方法は何ですか?

var array1 = ["cat", "sum","fun", "run"];
var array2 = ["bat", "cat","dog","sun", "hut", "gut"];

//if value in array1 is equal to value in array2 then return match: cat
4

13 に答える 13

61

当然、私のアプローチは、最初の配列を 1 回ループして、2 番目の配列の各値のインデックスをチェックすることでした。インデックスが の場合は> -1push返された配列に追加されます。

​Array.prototype.diff = function(arr2) {
    var ret = [];
    for(var i in this) {   
        if(arr2.indexOf(this[i]) > -1){
            ret.push(this[i]);
        }
    }
    return ret;
};

私のソリューションは、他のソリューションのように 2 つのループを使用しないため、実行速度が少し速くなる可能性があります。の使用を避けたい場合はfor..in、最初に両方の配列を並べ替えて、すべての値のインデックスを再作成できます。

Array.prototype.diff = function(arr2) {
    var ret = [];
    this.sort();
    arr2.sort();
    for(var i = 0; i < this.length; i += 1) {
        if(arr2.indexOf(this[i]) > -1){
            ret.push(this[i]);
        }
    }
    return ret;
};

使用法は次のようになります。

var array1 = ["cat", "sum","fun", "run", "hut"];
var array2 = ["bat", "cat","dog","sun", "hut", "gut"];

console.log(array1.diff(array2));

Array プロトタイプの拡張に問題がある場合は、これを簡単に関数に変更できます。

var diff = function(arr, arr2) {

thisそして、 func が最初に言った場所ならどこでも変更できますarr2

于 2012-09-15T00:51:50.050 に答える
15

この関数は、( loops/ を使用した他のソリューションで見られるように)O(n log(n) + m log(m))と比較して実行されます。これは、多くの値を処理する場合に役立ちます。O(n*m)indexOf

ただし、 どちら"a" > 1でもないため"a" < 1、これは同じタイプの要素に対してのみ機能します。

function intersect_arrays(a, b) {
    var sorted_a = a.concat().sort();
    var sorted_b = b.concat().sort();
    var common = [];
    var a_i = 0;
    var b_i = 0;

    while (a_i < a.length
           && b_i < b.length)
    {
        if (sorted_a[a_i] === sorted_b[b_i]) {
            common.push(sorted_a[a_i]);
            a_i++;
            b_i++;
        }
        else if(sorted_a[a_i] < sorted_b[b_i]) {
            a_i++;
        }
        else {
            b_i++;
        }
    }
    return common;
}

例:

var array1 = ["cat", "sum", "fun", "hut"], //modified for additional match
    array2 = ["bat", "cat", "dog", "sun", "hut", "gut"];
intersect_arrays(array1, array2);
>> ["cat", "hut"]
于 2012-09-15T13:14:15.757 に答える
12

最初の配列の要素を反復処理するたびに 2 番目の配列をループし、一致するかどうかを確認します。

var array1 = ["cat", "sum", "fun", "run"],
    array2 = ["bat", "cat", "dog", "sun", "hut", "gut"];

function getMatch(a, b) {
    var matches = [];

    for ( var i = 0; i < a.length; i++ ) {
        for ( var e = 0; e < b.length; e++ ) {
            if ( a[i] === b[e] ) matches.push( a[i] );
        }
    }
    return matches;
}

getMatch(array1, array2); // ["cat"]
于 2012-09-15T00:48:13.990 に答える
3

ロダッシュを使う

GLOBAL.utils = require('lodash')
var arr1 = ['first' , 'second'];
var arr2 = ['second '];

var result = utils.difference(arr1 , arr2);
console.log ( "result :" + result );
于 2015-07-08T10:52:50.180 に答える
2

値が null 以外の文字列または数値の場合、オブジェクトを辞書として使用できます。

var map = {}, result = [], i;
for (i = 0; i < array1.length; ++i) {
    map[array1[i]] = 1;
}

for (i = 0; i < array2.length; ++i) {
    if (map[array2[i]] === 1) {
        result.push(array2[i]);

        // avoid returning a value twice if it appears twice in array 2
        map[array2[i]] = 0;
    }
}

return result;
于 2012-09-15T00:48:47.497 に答える
2

フォーマットを行うことができるように回答として完了...

これは、あなたが通過する必要があるプロセスです。詳細については、配列をループします。

create an empty array
loop through array1, element by element. {
  loop through array2, element by element {
    if array1.element == array2.element {
      add to your new array
    }
  }
}
于 2012-09-15T00:45:21.683 に答える
2

一部の ES6 では:

let sortedArray = [];
firstArr.map((first) => {
  sortedArray[defaultArray.findIndex(def => def === first)] = first;
});
sortedArray = sortedArray.filter(v => v);

このスニペットはまた、 defaultArrayの順序に基づいてfirstArrをソートします

お気に入り:

let firstArr = ['apple', 'kiwi', 'banana'];
let defaultArray = ['kiwi', 'apple', 'pear'];
...
console.log(sortedArray);
// ['kiwi', 'apple'];
于 2018-02-21T13:21:45.630 に答える