2017-10-05 13 views
0

jQuery function to get all unique elements from an array?と他のスレッドが重複しているように見えるので、私は非常に慎重にフレーズしてみました。私は非常に明確にする必要があります、私は配列からすべての要素を取得したい、それは全く繰り返されません。つまり、配列[1,2,3,4,5,1,2,3,5]があれば[4]を返すはずです。他のスレッドでは、なぜ「ユニーク」という言葉が使われているのかわからなかったので、私は心を失いました。「他のものとは違って、唯一のものだ」という意味です。数回繰り返された数字を返す関数をビルドしていました。この質問をしているうちに、どうやって質問を解釈したのか分かりました。ネットの周りを見れば、誰もがそれを解釈しているように見える。 配列から一意の項目を取得する

は、私がここにこのコードの非常に近い感じ:

var myArr = [1,2,3,4,5,1,2,3,5]; 
 
    var unique = myArr.filter(function(value, index, self){ 
 
    return self.indexOf(value) != index; 
 
    }); 
 
console.log(unique);
繰り返されませんものを除いて、配列内の各値を配列で返します

。削除された要素をユニークに割り当てることができれば、私は設定されますが、フィルタ上のドキュメントを読むだけでも、それがどのように動作するのか理解しがたいです。

私はFreeCodeCampの環境でコーディングしていますので、私はライブラリを含めることができるかどうかわかりません。

+3

'self.indexOf(値)を返す=== self.lastIndexOf(値);' –

+0

私はこれらの他の質問に「ユニーク」の使用を推測のみ一意の値を含む所望*出力*配列を指しますSQLの「select distinct」機能によく似ています。しかし、はい、私はあなたが混乱した理由を見ることができます。 – nnnnnn

+0

「言語」という言い方まで...私は、あなたが望むものに対しては「ユニークな要素を」、他の人々は「ユニークな要素」を得ると言っています:p –

答えて

2

閉じる...のindexOfあなたは確かに非常に接近しているのlastIndexOf

var myArr = [1,2,3,4,5,1,2,3,5]; 
 
    var unique = myArr.filter(function(value, index, self){ 
 
    return self.indexOf(value) === self.lastIndexOf(value); 
 
    }); 
 
console.log(unique);

+0

私はこの解決策が簡単だろうと知っていました。値の最初のインデックスも最後のインデックスであれば、それは一意です。私はそれを考えなかったのは恥ずかしいです。ありがとうございました。 –

0

と同じであり、かつJaromanda-Xはあなた与えている@場合、ソートの...ちょうどチェック彼のコメントの解決策、return self.indexOf(value) === self.lastIndexOf(value);。あなたはそのような行を使用します。参考のため

var myArr = [1,2,3,4,5,1,2,3,5]; 
    var unique = myArr.filter(function(value, index, self){ 
    return self.indexOf(value) === self.lastIndexOf(value); 
    }); 
console.log(unique); 

は、.indexOf配列内の値の最初のインデックスを返し、.lastIndexOfは、配列内の値の最後のインデックスを返します。

0

indexOfを使用するソリューションでは、各要素の線形検索が必要になるため、パフォーマンスの複雑さはO(N^2)になります。

これは2段階の解決策です。数字のリストとそのカウントを格納し、このリストから1のカウントを持つ要素を探します。

let myArr = [1,2,3,4,5,1,2,3,5]; 
let counts = myArr.reduce((ht, v) => { ht[v] = (ht[v] || 0) + 1; return ht;} {}); 
let unique = Object.keys(counts).filter(k => counts[k] === 1).map(v => parseInt(v, 10)); 

このソリューションは、myArr内のすべてのアイテムが数値であることを前提としています。

let myArr = [1,2,3,4,5,'apple',1,2,3,5]; 
let counts = myArr.reduce((ht, v) => { 
    ht[v] = ht[v] || {v, count:0}; 
    ht[v].count +=1; 
    return ht; 
}, {}); 
let unique = Object.keys(counts) 
        .filter(k => counts[k].count === 1) 
        .map(k => counts[k].v); 

しかし、何[1, 1, 2, "2"]のような配列について:配列は、数値と文字列の組み合わせで、あなたはタイプを保存したい場合は、この溶液に(感謝@JaromandaXを)それを修正することができますか?上記の解決策は、オブジェクトの文字列表現からそのキーを派生するので、数字2と文字列"2"は同等と見なされます。

これに対する解決策は、タイプと値の組み合わせを使用してキーを生成することです。

let myArr = [1,2,3,4,5,'apple',1,"2",3,5]; 
let counts = myArr.reduce((ht, v) => { 
    let k = `${typeof(v)};${v}`; 
    ht[k] = ht[k] || {v, count:0}; 
    ht[k].count +=1; 
    return ht; 
}, {}); 
let unique = Object.keys(counts) 
        .filter(k => counts[k].count === 1) 
        .map(k => counts[k].v); 
+1

'.map()'が* 3つの引数で指定のコールバックを呼び出すと、 '.map(parseInt)'は必要な処理をしません。 – nnnnnn

+0

@nnnnn良い点! 'map'は2番目のパラメータとしてインデックスに渡り、' parseInt'はそれを基数として解釈します。それは試してみるにはひどいバグでしょう。私は今それを修正するつもりです。 –

+0

私は '.map(Number)'がうまくいくと思います。どちらの方法でも、このソリューションは数値の配列に対してのみ機能することに注意してください。配列に混合データ型が含まれている場合は、問題があります。 – nnnnnn

関連する問題