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

17

我有一个频道数组,我想将其转换为一个名为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;
}();

我想让map函数返回一个带有属性的对象而不是数组,这可行吗?是否错误?有什么建议吗?

这就是我希望最终看起来像的样子:

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

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

1
可能有点啰嗦,但也很清晰。我建议保留原样。 - Michael Berkowski
只是想添加,键可以有空格和大写字母,以获得更好的一致性。 - oriadam
3个回答

28
请使用.reduce()函数。
var channelSettings = channels.reduce(function(obj, itm) {
        var channel = itm.toLowerCase().replace(" ", "");
        obj[channel] = false;

        return obj;
}, {});

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


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

第二个参数引用了数组中的当前值。只要我们始终返回obj,第一个参数将始终是该对象,最终返回值也将是该对象。


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
}, {});

“am not i am” 已经说到了,但是 map 不仅可以返回数组,而且只能返回与原始数组相同长度的数组。它的设计目的是将一个数组的值一对一地转换成一个新数组。因此,在这里使用 reduce 是有意义的。
如果你使用一个简单的 for 循环或者 forEach 方法来向对象添加属性,你确实需要声明那个对象。所以,不,你不能在代码中没有 temp(除非你使用 reduce 而不是循环)。
更多信息请查看 MDN:
  1. map: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map
  2. reduce: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Reduce

这里是关于编程的内容,请提供优秀的解释!(这样我就不必在法庭上为我的绿色勾选做出辩护了..)非常感谢! - DanielEli
@RobG 啊,MDN链接 - 我完全忘记添加了。感谢您的编辑。 - Flambino
我最终使用了更为清晰的版本。var key = item.toLowerCase().replace(" ", "");
obj[key] = false; return obj
- DanielEli

0
嗯...看起来像是将它包装在一个这样的函数中就可以了。
function toObject(arr) {
  var rv = {};
  for (var i = 0; i < arr.length; ++i)
    if (arr[i] !== undefined) rv[arr[i]] = true;
  return rv;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接