如何使用数组和map函数构建一个javascript对象?

Dan*_*Eli 12 javascript

我有一个通道数组,我想将其转换为单个对象(channelSettings),每个通道都有一个true/false 属性.

我已经使用下面的代码工作,但它似乎很冗长.没有"temp"变量,有没有办法做到这一点?如果我能够驾驭它,那么我也可以驾驭自动执行功能.

var channels = ["TV", "Billboard", "Spot TV"];


var channelSettings = function() {
    var temp = {};

    channels.map(function(itm, i, a) {
        var channel = itm.toLowerCase().replace(" ", "");
        temp[channel] = false;
    });

    return temp;
}();
Run Code Online (Sandbox Code Playgroud)

我想我正在尝试让map函数返回一个具有属性而不是数组的对象.这可能吗?这是误导吗?建议?

这是我希望它最终看起来像:

var channels = ["TV", "Billboard", "Spot TV"];

var channelSettings = channels.map(function(itm, i, a) {
        var channel = itm.toLowerCase().replace(" ", "");
        return ????;
});
Run Code Online (Sandbox Code Playgroud)

小智 19

请改用.reduce()功能.

var channelSettings = channels.reduce(function(obj, itm) {
        var channel = itm.toLowerCase().replace(" ", "");
        obj[channel] = false;

        return obj;
}, {});
Run Code Online (Sandbox Code Playgroud)

演示: http : //jsfiddle.net/MjW9T/


第一个参数引用先前返回的项,第一次迭代除外,它引用数组中的第一项或者我们作为空对象提供的种子项.

第二个参数引用Array中的当前值.只要我们总是返回obj,第一个参数将始终是该对象,最终返回值也是如此.


Fla*_*ino 5

map函数接受一个数组,并返回一个数组。没有其他的。但你可以使用reduce

var settings = ["TV", "Billboard", "Spot TV"].reduce(function(obj, item) {
   obj[item.toLowerCase().replace(" ", "")] = false; // probably too concise
   return obj // yay, we can skip a semi-colon here :-P
}, {});
Run Code Online (Sandbox Code Playgroud)

好吧,“am not i am”打败了我,但无论如何:
map不仅返回数组,而且只返回与原始长度相同的数组。它的目的是将一个数组的值 1:1 转换为一个新数组。reduce意味着“将数组减少为单个值”。因此它在这里被使用。

如果您使用直接for循环或forEach方法向对象添加属性,则确实需要声明该对象。所以,不,你不能temp在代码中没有它(除非你使用reduce而不是循环)。

有关 MDN 的更多信息:

  1. 地图:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map
  2. 减少:https ://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Reduce