6

次のようなJavaScriptのエントリの配列が与えられます。

var entries = ["cat", "dog", "chicken", "pig"];

私は今、それらのユニークなペアごとの組み合わせをすべて反復したいと思います。この例では、次のことを確認したいと思います。

("cat", "dog"),
("cat", "chicken"),
...

scala などの他の言語では、これは非常に簡単です。あなたはただする

entries.combinations(2)

JavaScriptのライブラリに同様のメソッドまたは関数がありますか? それとも、入れ子になったループを使って醜い方法で自分で書く必要がありますか?

4

6 に答える 6

6
var arr = ["cat","dog","chicken","pig"].map(function(item,i,arr) {
    return arr.map(function(_item) { if( item != _item) return [item, _item];});
});

これにより、期待される結果が返されます。シムのない古いブラウザでは動作しません。

また、重複する値は、3 つの配列が 4 つあるのではなく、「未定義」です。これを処理するためのより適切な方法があると確信しています。

Array.prototype.map() - MDN

編集

これにより、適切なペアごとの組み合わせが得られます。

var arr = ["cat","dog","chicken","pig"].map(function(item,i,arr) {
    var tmp = arr.map(function(_item) { if( item != _item) return [item, _item];});
    return tmp.splice(tmp.indexOf(undefined),1), tmp;
});

配列スプライス法 - MDN

これは、同じコードのより読みやすいバージョンです。

var myArray = ["cat", "dog", "chicken", "pig"];
var pairwise = myArray.map(function(item, index, originalArray) {
    var tmp = originalArray.map(function(_item) {
        if (item != _item) {
            return [item, _item];
        }
    });
    tmp.splice(tmp.indexOf(undefined), 1); // because there is now one undefined index we must remove it.
    return tmp;
});
于 2012-12-22T22:37:43.373 に答える
3

私が知る限りではありません。ネストされたループに固執する必要があると思います。

同様の質問がここで尋ねられました:数値の配列の各組み合わせを javascript で出力すると、そこに答えが見つかるかもしれません。

于 2012-08-24T06:34:55.523 に答える
0

質問を確認した後、この回答では質問が正しく解決されません。質問はすべての組み合わせを求めますが、以下の関数は配列の隣接するすべての偶数インデックスと奇数インデックスを組み合わせます。

これは、reduceを使用して行ったペアワイズ実装です

function pairwise(arr) {
    return arr.reduce(function(acc, current, index) {
        var isFirstPair = (index % 2) === 0;

        if (isFirstPair) {
            acc.push([current]);
        } else {
            lastElement = acc[acc.length - 1];
            lastElement.push(current);
        }

        return acc;
    }, []);
};

var nums = [1,2,3,4,5,6];

var res = pairwise(nums);

res.forEach(function(elem) {
   console.log(elem); 
});

戻り値:

[
  [1, 2]
  [3, 4]
  [5, 6]
]
于 2012-12-22T22:07:23.917 に答える