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

辅助函数:

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 回答
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 回答