繁体   English   中英

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

[英]how to build a javascript object using an array and the map function?

我有一个通道数组 ,我想将其转换为单个对象 (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 ????;
});

请改用.reduce()函数。

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

        return obj;
}, {});

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

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

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

有关MDN的更多信息:

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

嗯..看起来像在这样的函数中包装它会这样做。

function toObject(arr) {
  var rv = {};
  for (var i = 0; i < arr.length; ++i)
    if (arr[i] !== undefined) rv[arr[i]] = true;
  return rv;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM