我有一个通道数组,我想将其转换为单个对象(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,第一个参数将始终是该对象,最终返回值也是如此.
该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 的更多信息: