正确插入键值对javascript

时间:2016-05-12 04:26:12

标签: javascript arrays

我正在努力修复一些遗留代码。我做了一个例子,结果将随之而来。这是旧数组的一个例子。

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步是重新编写代码以使用对象而不是数组。我只是不确定该怎么做。

3 个答案:

答案 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>");