challenge 重複する要素を取り除く

与えられたリストxsの中から、 2回以上出現するものを全部取り除いてください。

サンプル入力
[3, 1, 4, 1, 5, 9, 2, 6, 5]
サンプル出力
[3, 4, 9, 2, 6]

これはアレイのuniqの派生問題です。 リストとかアレイという言葉は言語によってまちまちの意味で使われているので、 「配列のようなもの」という漠然とした意味にとって構いません。

Posted feedbacks - JavaScript

 uneval の無い環境とプロパティの順番が保証されない可能性に配慮したら,えらく冗長になってしまった。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function doukaku56(a){
  if(typeof uneval != 'function') var uneval = function(o){
    if(o === undefined) return 'undefined';
    if(o === null)      return 'null';
    var s = o.toString();
    switch(o.constructor){
     case Object:
      if(s.indexOf('[object Object')) return s;
      var m = []; for(var p in o) m[m.length] = p +':'+ arguments.callee(o[p]);
      return '({'+ m.join(', ') +'})';
     case Array:
      var a = []; for(var i = o.length; i--;) a[i] = arguments.callee(o[i]);
      return '['+ a.join(', ') +']';
     case String:
      return '"'+ s.replace(/[\"\\]/g,'\\$&').replace(/\r/g,'\\r').replace(/\n/g,'\\n') +'"';
     case Date: return '(new Date('+ +o +'))';
     default:   return s;
    }
  };
  var r = [], h = {}, k, i, l;
  for(i = 0, l = a.length; i < l; i++) h[k = uneval(a[i])] = k in h ? -1 : i;
  for(k in h) if(h[k] >= 0) r[r.length] = h[k];
  for(i = r.sort(function(x, y){ return x - y }).length; i--;) r[i] = a[r[i]];
  return r;
}

 uneval なんか使わずとも === で比較して除けばいいことに気付く。↑ の20倍以上速い…。(--;)

 doukaku56( [ 1, "1", [1], new Number(1), { valueOf: function(){ return 1 } } ] )
  => 1,1,1,1,[object Object]
1
2
3
4
5
6
7
function doukaku56(a){
  for(var r = [], d = {}, i = 0, j, l = a.length; i < l; i++) if(!d[i]){
    for(j = l; --j > i;) if(a[i] === a[j]) d[i] = d[j] = true;
    if(!d[i]) r[r.length] = a[i];
  }
  return r;
}

ワンライナー。
1
[3, 1, 4, 1, 5, 9, 2, 6, 5].filter(function(e, i, a){return a.slice(0, i).indexOf(e) == -1 && a.slice(i + 1).indexOf(e) == -1;});

Index

Feed

Other

Link

Pathtraq

loading...