2

私はこれをよりクリーンで最適な方法で行う方法を考えていました:

次の構造のオブジェクトがあります。

{
   "125": 2,
   "439": 3,
   "560": 1,
   "999": 2,
   ...
}

すべてのキーを、その値で示される回数だけ繰り返すフラットな配列を作成したいと思います。また、キー(文字列)を整数に変換するためのボーナスポイント。この例では、結果の配列は次のようになります。

[ 125, 125, 439, 439, 439, 560, 999, 999 ]

私はいくつかの方法を試しましたが、それらはすべて過剰に設計されているように見えます。確かにもっと簡単な方法があります。これは私がアンダースコアで得たものです(そしてそれは文字列の配列も整数も返します):

_.compact(_.flatten(_.map(files, function(num, id) { 
     return new Array(num+1).join('$'+id).split('$') 
})))

これを達成する方法はたくさんあることを私は知っています。クリーンで迅速な方法だけが必要です。Ruby開発者になると、のように簡単になります。

> files = {"125" => 2, "439" => 3, "560" => 1, "999" => 2}
 => {"125"=>2, "439"=>3, "560"=>1, "999"=>2} 
> files.map {|key, value| [key.to_i] * value}.flatten
 => [125, 125, 439, 439, 439, 560, 999, 999]

前もって感謝します。

4

6 に答える 6

1

これを試して:

var obj = {
  "125": 2,
  "439": 3,
  "560": 1,
  "999": 2
}

var arr = [];

for (prop in obj) {
  for (var i = 0; i < obj[prop]; i++)
    arr.push(parseInt(prop));
}

console.log(arr)

于 2012-08-10T17:25:25.627 に答える
1

私はこれがプレーンなJavaScriptであることを知っていますが、あなたが投稿したコードよりも私にはきれいに見えます:

var dict = {
   "125": 2,
   "439": 3,
   "560": 1,
   "999": 2
}
var result = [];

for(key in dict)
    for(i = 0; i < dict[key]; i++)
        result.push(key * 1);

alert(result);
于 2012-08-10T17:26:44.390 に答える
0

うーん...私が着いたかどうかはわかりませんが、多分このようなものです:

var myObj = {
   "125": 2,
   "439": 3,
   "560": 1,
   "999": 2
},
myArray = [];

for(k in myObj){
    for(i = 0; i < myObj[k]; i++){
        myArray.push(k);
    }
}
console.log(myArray)
于 2012-08-10T17:26:45.590 に答える
0

これらのアプローチのいずれかがよりクリーンであるかどうかは非常に主観的です。

// some helper function for creating an array with repeated values
function repeat(val, times) {
    var arr = [];
    for(var i = 0; i < times; i = arr.push(val));
    return arr;
}

function convert(obj) {
    var result = [], key;
    for(key in obj) {
        result = result.concat(repeat(+key, obj[key]));
    }
    return result;
}

または、より機能的なアプローチ:

Object.keys(obj).reduce(function(result, key) {
    return result.concat(repeat(+key, obj[key]));
}, []);

// with underscore.js
_.reduce(_.keys(obj), function(result, key) {
    return result.concat(repeat(+key, obj[key]));
}, []);
于 2012-08-10T17:26:54.447 に答える
0

上記の他の回答の問題は、javascriptのfor..in言語構造が、オブジェクトのプロトタイプチェーンからのすべてのキーを含むことです。この場合、正しいキーのみをチェックして追加する必要があります。

var obj= {
   "125": 2,
   "439": 3,
   "560": 1,
   "999": 2
}

var arr=[];

for (var item in map) {
  //important check!
  if (map.hasOwnProperty(item)) {
    arr.push(item);
  }
}

http://www.yuiblog.com/blog/2006/09/26/for-in-intrigue/も参照してください。

于 2012-08-10T17:34:48.843 に答える
0

ヘルパー関数:

function flatten(obj){
 //static Array method: create array (a elements, value b) 
 Array.aXb = Array.aXb || function(a,b){
    b = b || 0;
    return String(this(a)).split(',').map(function(){return b;});
 }
 //obj2array 
 var arr = [];
 for (var k in obj)
    if (+obj[k]) arr = arr.concat(Array.aXb(+obj[k],k));
 return arr;
}
var obj= {"125": 2,"439": 3,
          "560": 1,"999": 2 },
flatten(obj); //=> [125,125,439,439,439,560,999,999]
于 2012-08-10T17:43:46.980 に答える