【问题标题】:In Javascript a dictionary comprehension, or an Object `map`在 Javascript 中,字典理解,或 Object `map`
【发布时间】:2012-06-19 13:27:48
【问题描述】:

我需要从 Javascript 的列表中生成几个对象。在 Python 中,我会这样写:

{key_maker(x): val_maker(x) for x in a_list}

问的另一种方式是,是否存在像 jQuery.map() 这样聚合对象的东西?这是我的猜测(不起作用):

var result = {}
$.map(a_list, function(x) {
    $.extend(result, {key_maker(x): val_maker(x)})
})

【问题讨论】:

  • 仅供参考,您的 $.extend 版本将无法使用。对象文字表示法中的属性标识符不能是表达式的结果。此代码将失败...{key_maker(x): val_maker(x)}
  • @amnotiam 没意识到!谢谢

标签: javascript jquery python


【解决方案1】:

假设a_list 是一个数组,最接近的可能是使用.reduce()

var result = a_list.reduce(function(obj, x) {
    obj[key_maker(x)] = val_maker(x);
    return obj;
}, {});

数组推导式可能会出现在 JavaScript 的未来版本中。


您可以使用 compatibility patch from MDN 修补不符合 ES5 的实现。


如果a_list 不是一个数组,而是一个普通对象,你可以使用Object.keys() 来执行同样的操作。

var result = Object.keys(a_list).reduce(function(obj, x) {
    obj[key_maker(a_list[x])] = val_maker(a_list[x]);
    return obj;
}, {});

【讨论】:

  • 如果使用没有reduce 的JS 版本,我认为jQuery 也不会添加它。但下划线有。
  • @MarkReed:是的。我更新了一个指向 MDN 兼容性补丁的链接。
  • jQuery 还没有 reduce。你可以在这里找到一些实现:bugs.jquery.com/ticket/1886
  • 使用下划线或lodash,它将是:_.reduce(a_list, function(obj, x){ ... }, {});
  • 使用箭头符号和逗号运算符的略短版本:a_list.reduce((o, x) => (o[key_maker(x)] = val_maker(x), o), {})
【解决方案2】:

这是一个不使用reduce的版本:

Object.fromEntries( a_list.map( x => [key_maker(x), value_maker(x)]) );

Object.fromEntries 与 Lodash 中的_.fromPairs 基本相同。这对我来说最像 Python dict 理解。

【讨论】:

  • 在没有特殊语法 IMO 的情况下,我们可以更接近理解,尽管截至 2019 年 1 月,它仍然是一个提案,并没有在 NodeJS 中实现。
  • 我认为这很像dict理解,可能是公认的答案
【解决方案3】:

老问题,但在新版本的 Javascript 中答案略有变化。使用 ES2015 (ES6),您可以像这样实现单行对象理解:

a_list.reduce((obj, x) => Object.assign(obj, { [key_maker(x)]: value_maker(x) }), {})

【讨论】:

    【解决方案4】:

    ES5OrderedDict 引入了 Map。地图理解可能如下所示:

    Map( Array.map(function(o){return[ key_maker(o), val_maker(o) ]}))
    

    例子:

    > a_list = [ {x:1}, {x:2}, {x:3} ]
    < [ Object, Object, Object ]
    >
    > let dict = new Map(a_list.map(function(o){return[ o.x, o.x**2 ]}))
    < Map[3]
    < 0 : {1 => 1}
    < 1 : {2 => 4}
    < 2 : {3 => 9}
    >
    > dict.get(2)
    < 4
    

    【讨论】:

      【解决方案5】:

      可能是这样的,使用Lodash var result = _.fromPairs(a_list.map(x => [key_maker(x), value_maker(x)]));

      【讨论】:

        【解决方案6】:

        更短的 ES6 版本是:

        a_list.reduce((obj, x) => (obj[key_maker(x)] = val_maker(x), obj),{})
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-03-14
          • 2013-01-22
          • 2017-06-17
          • 2021-07-24
          • 2016-09-03
          • 1970-01-01
          • 2016-10-01
          相关资源
          最近更新 更多