【问题标题】:how to build a javascript object using an array and the map function?如何使用数组和 map 函数构建 javascript 对象?
【发布时间】:2012-06-15 22:20:23
【问题描述】:

我有一个频道数组,我想将其转换为一个单个对象(channelSettings),每个频道都有一个真/假属性。

我已经使用下面的代码让它工作了,但它看起来很冗长。没有“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 ????;
});

【问题讨论】:

  • 可能有点冗长,但也清晰。我会投票保持原样。
  • 只想补充一点,键可以有空格和大写字母。以获得更好的一致性。

标签: javascript


【解决方案1】:

hmm.. 看起来像这样将它包装在一个函数中就可以了。

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

【讨论】:

    【解决方案2】:

    改用.reduce() 函数。

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

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


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

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

    【讨论】:

      【解决方案3】:

      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. 减少:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/Reduce

      【讨论】:

      • 这里也有很好的解释! (我不必在法庭上为我的绿色支票决定辩护......)谢谢!
      • @RobG 啊,MDN 链接——我完全忘了添加这些。感谢您的编辑
      • 我最终使用了更清晰的版本。 var key =item.toLowerCase().replace(" ", "");对象 [键] = 假;返回对象
      猜你喜欢
      • 2022-09-29
      • 2021-11-23
      • 1970-01-01
      • 2021-12-02
      • 2021-11-09
      • 1970-01-01
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多