Object→Arrayにしたい

投稿者: user10259

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さんの解答を踏まえて処理計測を行いましたので、参考程度に置いておきます。
変に考えるよりも普通にする方が良いみたいで……
あんまり差が無いみたいですね。

_x000D_

_x000D_

var test = null;_x000D_
_x000D_
function initialize(len){_x000D_
	test = {};_x000D_
	for(var n=0;n<len;++n){ test[n]=n.toString(); }_x000D_
	return false;_x000D_
}_x000D_
_x000D_
function change(obj, type){_x000D_
	var start = (+new Date());_x000D_
	var arr = new Array();_x000D_
	switch(type){_x000D_
		case 0:_x000D_
			for(var key in obj){ arr.push(obj[key]); }_x000D_
			break;_x000D_
		case 1:_x000D_
			arr = Object.keys(obj).map(function(key){ return obj[key]; });_x000D_
			break;_x000D_
		case 2:_x000D_
			arr = Object.keys(obj).map(key => obj[key]);_x000D_
			break;_x000D_
		case 3://lengthが残るのでshift_x000D_
			test.length = Object.keys(test).length + 1;//lengthのサイズ分+1_x000D_
			arr = Array.prototype.slice.call(test).shift();_x000D_
			break;_x000D_
		default:_x000D_
	}_x000D_
	var diff = (+new Date()) - start;_x000D_
	return diff;_x000D_
}_x000D_
_x000D_
function check(type){_x000D_
	var loop = 30;_x000D_
	var count = 0;_x000D_
	for(var n=0;n<loop;++n){ count+=change(test,type); }_x000D_
	document.getElementById("res").innerText = (count / loop);_x000D_
}_x000D_
_x000D_
initialize(131072);

_x000D_

<button onclick="check(0)">case 0</button>_x000D_
<button onclick="check(1)">case 1</button>_x000D_
<button onclick="check(2)">case 2</button>_x000D_
<button onclick="check(3)">case 3</button>_x000D_
<div id="res"></div>

_x000D_

_x000D_

_x000D_

解決

JSON.stringify()であっても内部的にループしていることには変わらないと思いますが。
「添え字切り捨てで」があいまいですがとりあえず

function change2arr(obj){
    return Object.keys(obj).map(key => obj[key]);
}

もしくは

function change2arr(obj){
    return Object.keys(obj).map(function(key){ return obj[key]; });
}

とか。対応ブラウザーには気を付けてください。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *