重複する要素を取り除く
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]
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;});
|





にしお
#3412()
Rating1/1=1.00
これはアレイのuniqの派生問題です。 リストとかアレイという言葉は言語によってまちまちの意味で使われているので、 「配列のようなもの」という漠然とした意味にとって構いません。
[ reply ]