Object→Arrayにしたい
var test = {1:"1",2:"2",3:"3",4:"4",5:"5"};
上記のようなオブジェクトを添え字切り捨てで配列に変換したいです。
色々と調査してみたのですが、
Array.prototype.slice.call(test);
Array.prototype.slice.apply(test);
が動かず空の配列が返却されてしまうので苦難の末
「一度JSONにしちゃえば文字列操作で配列に出来ないか?」と思いたちました。
それで、結果が下記になります。
function change2arr(obj){
var str = JSON.stringify(obj);
str = str.substr(1, (str.length -2));
var exep = /:"(.*?)"/g;
var arr = str.match(exep);
str = JSON.stringify(arr);
exep = /\\"(.*?)\\"/g;
return str.match(exep).join("-spl-").replace(/\\"/g,"").split("-spl-");
}
動くは動くのですが、
理想は最初のmatch
でグループ化されたものの配列が返ってくることでした。
ですが、グループ化されたものではなく
検索対象の文字列全てが戻ってきたので加工しています。
そこで本題なのですが、
ループを使わず、スマートな方法でオブジェクトを配列にすることは出来ないでしょうか?
どうぞ、よろしくお願いいたします。
上記に書いた関数は計測した結果、思ったよりも遅かったので破棄することにしました。
sayuriさんの解答を踏まえて処理計測を行いましたので、参考程度に置いておきます。
変に考えるよりも普通にする方が良いみたいで……
あんまり差が無いみたいですね。
var test = null;
function initialize(len){
test = {};
for(var n=0;n<len;++n){ test[n]=n.toString(); }
return false;
}
function change(obj, type){
var start = (+new Date());
var arr = new Array();
switch(type){
case 0:
for(var key in obj){ arr.push(obj[key]); }
break;
case 1:
arr = Object.keys(obj).map(function(key){ return obj[key]; });
break;
case 2:
arr = Object.keys(obj).map(key => obj[key]);
break;
case 3://lengthが残るのでshift
test.length = Object.keys(test).length + 1;//lengthのサイズ分+1
arr = Array.prototype.slice.call(test).shift();
break;
default:
}
var diff = (+new Date()) - start;
return diff;
}
function check(type){
var loop = 30;
var count = 0;
for(var n=0;n<loop;++n){ count+=change(test,type); }
document.getElementById("res").innerText = (count / loop);
}
initialize(131072);
<button onclick="check(0)">case 0</button>
<button onclick="check(1)">case 1</button>
<button onclick="check(2)">case 2</button>
<button onclick="check(3)">case 3</button>
<div id="res"></div>