2016-11-19 22 views
2

私は現時点でfreecodecampでコーディングすることを学んでおり、タスクを完了することを任されています。ここにあります。複数の配列に含まれる要素を複数回フィルタリングする方法はありますか?

2つ以上の配列を取り、指定された配列の対称差(△または⊕)の配列を戻す関数を作成します。二組の数学的な用語 "対称差は" 要素の集合であり、2つの(例セットA = {1、2、3}とB =集合{2、3、4})のセット、 考える

これらは2つのセットのいずれかにありますが、両方ではありません(A△B = C = {1,4})。あなたが取る追加の対称差(例えば、D = {2,3}のセットでは )の場合は、両方のセットのどちらかに の要素を持つセットを取得する必要があります(C△D = {1、 4}△{2,3} = {1,2,3,4})。

私が試みたのは、引数オブジェクトのすべての要素を連結することでした。私はネイティブフィルタメソッドを使用して、複数回発生した配列内の要素をフィルタリングしようとしています。ここでは私が今試したことがあります。

function sym() { 
    let args = Array.prototype.slice.call(arguments); 
    return args.reduce((prev,current) => prev.concat(current),[]) //concat all arguments 
       .filter((element, index, array) => array.indexOf(element) !== index); 
} 

誰かが見て助けてくれますか?大変感謝しています!

答えて

2

最初にaをフィルタリングし、次にbをフィルタリングし、結果を連結することができます。

function symetricalDifference(a, b) { 
 
    function isNotInSet(set){ 
 
     return function (value) { 
 
      return set.indexOf(value) === -1; 
 
     } 
 
    } 
 

 
    return a.filter(isNotInSet(b)).concat(b.filter(isNotInSet(a))); 
 
} 
 

 
console.log(symetricalDifference([1, 2, 3], [2, 3, 4])); // [1, 4] 
 
console.log(symetricalDifference([1, 4], [2, 3]));  // [1, 4, 2, 3]

+1

どのようなエレガントなソリューションですか。どうもありがとうございました! – Nate

0

私はこの1つはあなたのために働くだろうと思います。

function set() { 
    let args = Array.prototype.slice.call(arguments); 
    return args 
     .reduce((prev, next) => prev.concat(next), []) 
     .sort((a, b) => a - b) 
     .filter((el, i, array) => { 
      if(i === 0) return true; 
      if(el !== array[i-1]) { 
       if(el !== array[i+1]) return true; 
      } 
     }); 
} 

ロジックは次のとおりです。最初に、私たちは私たちがこのような[1,2,2,3,4,5,5]昇順何かの整数を持って一つにすべての配列をCONCATし、それをソートする必要があります。次に、この整数リストで、ある整数が何度も来たら、私たちは元の配列のうちの2つ以上を持っているので、それらをフィルタリングする必要があります。

そして結果は以下のとおりです。

set([1,2,3], [2,3,4]); 
> [1,4] 

そして、あなたのタスクが言うように、それは、二つ以上の入力配列のために働く:

二つ以上の配列をとる関数を作成します...

set([1,2,3], [2,3,4,11], [5,4,8]); 
> [1,5,8,11] 

ただし、ここではタイプチェックやその他のエラー処理が必要です。

これは整数にのみ適用されます。

整数の配列をソートする場合は、hereと表示されます。

これが役に立ちます。

0

console.log(sym([1, 2, 3], [5, 2, 1, 4])) 
 
function sym() { 
 
\t var count = {} 
 
\t for (var i=0; i<arguments.length; ++i) { 
 
\t \t arguments[i].forEach(function(v){ 
 
\t \t \t if (!count[v]) count[v] = 1 
 
\t \t \t else ++count[v] 
 
\t \t }) 
 
\t } 
 
\t return Object.keys(count).filter(function(k) { 
 
\t \t return count[k] === 1 
 
\t }) 
 
}

0

私は

1に提案)を

2、重複のリストを見つけることがフィルタのindexOfを使用)フィルタを使用をソートして、最終結果を以下のように返します。


             
  
function symmetricalDiff(a, b){ 
 
    var common = a.concat(b) 
 
     .filter(function(d, index, inputArray){ 
 
      return inputArray.indexOf(d) != index 
 
     }); 
 
    return (common.length==0) ? a.concat(b).sort() : 
 
     a.concat(b).filter(function(d){ return !common.includes(d)}).sort(); 
 
} 
 
console.log(symmetricalDiff([1,2,3], [2,3,4])); // [1, 4] 
 
console.log(symmetricalDiff([1,4], [2,3]));  // [1, 4, 2, 3]
関連する問題