19369


`var test = {1:"1",2:"2",3:"3",4:"4",5:"5"};`  
上記のようなオブジェクトを添え字切り捨てで配列に変換したいです。  
色々と調査してみたのですが、  
`Array.prototype.slice.call(test);`  
`Array.prototype.slice.apply(test);`  
が動かず空の配列が返却されてしまうので苦難の末  
「一度JSONにしちゃえば文字列操作で配列に出来ないか？」と思いたちました。  
それで、結果が下記になります。

[code]

    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-");
    }
    
[/code]

動くは動くのですが、  
理想は最初の`match`でグループ化されたものの配列が返ってくることでした。  
ですが、グループ化されたものではなく  
検索対象の文字列全てが戻ってきたので加工しています。

そこで本題なのですが、  
ループを使わず、スマートな方法でオブジェクトを配列にすることは出来ないでしょうか？  
どうぞ、よろしくお願いいたします。

* * *

上記に書いた関数は計測した結果、思ったよりも遅かったので破棄することにしました。  
sayuriさんの解答を踏まえて処理計測を行いましたので、参考程度に置いておきます。  
変に考えるよりも普通にする方が良いみたいで……  
あんまり差が無いみたいですね。

[code]

    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);
[/code]

[code]

    <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>
[/code]


CC BY-SA 3.0
2015-11-27T06:36:22.877
19365
2015-11-27T09:20:16.167
2015-11-27T09:20:16.167
question
javascript 正規表現
Object→Arrayにしたい


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

[code]

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

もしくは

[code]

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

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


CC BY-SA 3.0
2015-11-27T07:12:09.067
19369
2015-11-27T07:12:09.067
4236
19365
answer


安全な方法かはわかりませんが、test.length を設定すれば動くようです。node 5.0.0での実行例です。

[code]

    > test = {1:"1",2:"2",3:"3",4:"4",5:"5"};
    test = {1:"1",2:"2",3:"3",4:"4",5:"5"};
    { '1': '1', '2': '2', '3': '3', '4': '4', '5': '5' }
    > Array.prototype.slice.call(test)
    []
    > test.length = 6
    6
    > Array.prototype.slice.call(test)
    [ , '1', '2', '3', '4', '5' ]
    
[/code]


CC BY-SA 3.0
2015-11-27T08:57:11.243
19375
2015-11-27T08:57:11.243
10364
19365
answer