Javascript,重复一个对象键AND-times,是AND的值

时间:2012-08-10 17:19:04

标签: javascript arrays

我想知道如何以更清洁和最佳的方式做到这一点:

我有一个具有以下结构的Object:

{
   "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]

提前致谢。

6 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分: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);

答案 2 :(得分: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)

答案 3 :(得分: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]));
}, []);

答案 4 :(得分: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/

答案 5 :(得分: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]