我想知道如何以更清洁和最佳的方式做到这一点:
我有一个具有以下结构的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]
提前致谢。
答案 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);
}
}
答案 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]