43

状態の説明jQuery.unique():

DOM 要素の配列をその場で並べ替え、重複を削除します。これは、文字列や数値ではなく、DOM 要素の配列に対してのみ機能することに注意してください。

説明を念頭に置いて、誰かが以下のコードが機能する理由を説明できますか?

<div></div>
<div></div>​

var arr = ['foo', 'bar', 'bar'];

$.each(arr, function(i, value){
    $('div').eq(0).append(value + ' ');
});

$.each($.unique(arr), function(i, value){
    $('div').eq(1).append(value  + ' ');
});
​

http://jsfiddle.net/essX2/

ありがとう

編集:可能な解決策:

function unique(arr) {
var i,
    len = arr.length,
    out = [],
    obj = { };

for (i = 0; i < len; i++) {
    obj[arr[i]] = 0;
}
for (i in obj) {
    out.push(i);
}
return out;
};
4

8 に答える 8

103

機能しますが、おそらく関数の説明を考慮する必要があります。作成者が、dom 要素以外の配列をフィルタリングするようには設計されていないと言う場合は、おそらくその意見に耳を傾ける必要があります。
さらに、この機能は非常に簡単に再現できます。

function unique(array){
    return array.filter(function(el, index, arr) {
        return index === arr.indexOf(el);
    });
}

(デモページ)

アップデート:

indexOfこのコードがすべてのブラウザー ( orなどの一部の配列機能をサポートしていない ie7 を含むfilter) で機能するように、jquery 機能を使用して次のように書き直します。

  • $.grepの代わりに使用Array.filter
  • $.inArrayの代わりに使用Array.indexOf

翻訳されたコードは次のようになります。

function unique(array) {
    return $.grep(array, function(el, index) {
        return index === $.inArray(el, array);
    });
}

(デモページ)

于 2012-04-17T13:31:56.773 に答える
23

配列文字列などで機能する可能性がありますが、その用途向けには設計されていません...

のコードunique()がSizzleに次のように隠れていることに注意してくださいuniqueSortgithub source

その余分なコードのいくつかはどの配列でも機能するように見えるかもしれませんが、sortOrder ここで定義されているように細心の注意を払ってください。物事を「ドキュメントの順序」に並べるために多くの余分な作業を行います。したがって、ドキュメントにDOM要素の配列でのみ使用する必要があると記載されているのはなぜですか。

于 2012-04-17T13:18:37.420 に答える
15

私はDOMでユニークな作品を知っていますが、これはintの配列で動作します:

$.unique(arr.sort());
于 2013-11-14T14:04:50.180 に答える
4

$.unique同一の DOM要素ではなく、重複するDOM 要素を削除します。文字列で使用しようとすると、予期しない動作が発生し、(おそらく) 並べ替えが失敗します。

これは jQuery による内部使用のみを目的とした関数であり、あなたや私のような単なる人間には役に立ちません。

于 2012-04-17T13:15:17.473 に答える
3

jQuery.unique() 関数を拡張して、任意の型の要素を含む配列を処理する簡単な方法があります。

(function($){

    var _old = $.unique;

    $.unique = function(arr){

        // do the default behavior only if we got an array of elements
        if (!!arr[0].nodeType){
            return _old.apply(this,arguments);
        } else {
            // reduce the array to contain no dupes via grep/inArray
            return $.grep(arr,function(v,k){
                return $.inArray(v,arr) === k;
            });
        }
    };
})(jQuery);

// in use..
var arr = ['first',7,true,2,7,true,'last','last'];
$.unique(arr); // ["first", 7, true, 2, "last"]

var arr = [1,2,3,4,5,4,3,2,1];
$.unique(arr); // [1, 2, 3, 4, 5]

http://www.paulirish.com/2010/duck-punching-with-jquery/ - 例 2

于 2014-05-28T19:15:38.380 に答える
0

$.unique は、配列に必要な場合にのみ、重複した DOM 要素を削除します。

var result=[] ;
$.each([12,1,2,4,3,1,4,3,3,2,111], 
        function(i,e){ if($.inArray(e,result)===-1) result.push(e) ;});
result;
于 2013-11-01T14:12:43.057 に答える