我正在努力修复一些遗留代码。我做了一个例子,结果将随之而来。这是旧数组的一个例子。
var old = { 1: ['A', 'E', 'I', 'O', 'U'] };
这应该是返回的内容
var expected = { a: 1, e: 1, i: 1, o: 1, u: 1 };
现在如果我使用这个
var ETL = function(){};
ETL.prototype.transform = function(old){
var array = [];
for (var variable in old) {
console.log(variable);
for(var i = 0; i < old[variable].length; i++){
var obj = {};
var key = old[variable][i].toLowerCase();
obj[key] = parseInt(variable);
array.push(obj);
}
}
return array;
};
我得到了这个结果
[ { a : 1 }, { e : 1 }, { i : 1 }, { o : 1 }, { u : 1 } ]
这真的很接近,但不是我想要的。当我真正想要一个具有键值对的对象时,我想我已经创建了一个对象数组。我认为第1步是将数组重新声明为对象,然后第2步是重新编写代码以使用对象而不是数组。我只是不确定该怎么做。
答案 0 :(得分:2)
var obj = {};
for(var i = 0; i < old[variable].length; i++){
var key = old[variable][i].toLowerCase();
obj[key] = parseInt(variable);
//array.push(obj);
}
只宣告一次obj。您正在循环的每次迭代中创建它
答案 1 :(得分:0)
您可以使用数组reduce
方法解决此问题。
var old = { 1: ['A', 'E', 'I', 'O', 'U'] };
var _getOne = old['1']; //get value of key 1
function getWordCnt(arr){
return arr.reduce(function(prev,next){
prev[next] = (prev[next] + 1) || 1;
return prev;
},{});
}
console.log(getWordCnt(_getOne))
选中此jsfiddle
注意:最好将密钥作为字符串而不是整数
答案 2 :(得分:0)
假设您拥有对象的许多属性,每个属性都有一个大写字母数组,则以下单行分配会将它们全部转换为新形式。
var old = { 1: ['A', 'E', 'I', 'O', 'U'],
2: ['B', 'T', 'O', 'M', 'V'],
3: ['C', 'B', 'X', 'N', 'S']
},
newList = Object.keys(old).map(k => old[k].reduce((p,c) => {p[c.toLowerCase()] = k*1; return p},{}));
document.write("<pre>" + JSON.stringify(newList,null,2) + "</pre>");