Javascript,重复一个对象键N次,是N个它的值

Javascript, repeating an object key N-times, being N its value

本文关键字:一个对象 Javascript      更新时间:2023-09-26

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

我有一个具有以下结构的对象:

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

提前谢谢。

试试这个:

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)

我知道

这是普通的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);

嗯... 不确定我是否得到了,但也许是这样的:

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)

上面其他答案的问题在于 for..在 JavaScript 中的语言构造将涉及对象原型链中的所有键。在这种情况下,我们应该检查并仅添加正确的键。

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/

这些方法中的任何一种是否更干净是相当主观的:

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

一个辅助函数:

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]