如何在Javascript中复制Python的dict.items()?

问题描述 投票:8回答:4

在Javascript中我有一个JSON对象,我只想从中处理这些项目:

var json = {
    itema: {stuff: 'stuff'},
    itemb: {stuff: 'stuff'},
    itemc: {stuff: 'stuff'},
    itemd: {stuff: 'stuff'}
}

在Python中,我可以做到

print json.items()
[{stuff: 'stuff'},{stuff: 'stuff'},{stuff: 'stuff'},{stuff: 'stuff'}]

我能这样做是js吗?

javascript associative-array
4个回答
3
投票

如果没有扩展您不想要的Object.prototype,就不能像在python中那样执行此操作,因为它是痛苦的路径。

您可以轻松地创建一个辅助函数,它可以循环遍历对象并将值放入数组中,但是,如下所示:

function items(obj) {
 var i, arr = [];
 for(i in obj) {
   arr.push(obj[i]);
 }
 return arr;
}

Ps:JSON是一种数据格式,你拥有的是一个对象文字。


1
投票

在python中,dict.items返回一个包含密钥和dict值的元组列表。 Javascript没有元组,所以它必须是嵌套数组。

如果你能原谅我的一些python代码来显示差异。

>>> {1:2, 2:3}.items()
[(1, 2), (2, 3)]
>>> {1:2, 2:3}.values()
[2, 3]

我看到接受的答案返回一个对象值数组,它相当于python函数dict.values。要求的是dict.items。要做到这一点,只需循环并构建一个包含2个元素数组的嵌套数组。

function items(obj){

    var ret = [];
    for(v in obj){
        ret.push(Object.freeze([v, obj[v]]));
    }
    return Object.freeze(ret);
}

我把Object.freeze变成了迂腐,并强制不要改变返回的值,以模仿python元组的不变性。显然,如果你把它拿出来它仍然有用。

应该注意的是,这样做有点违背了items的目的,因为它是以线性而非关联方式迭代对象时使用的,并且它避免计算哈希值以查找关联数组中的每个元素。对于那些关心大型物体的小物件,它可能会减慢你的速度,并且可能有更惯用的方式在javascript中做你想做的事情。

另一种更新的方法是使用Object.entries(),它将完全按照您的要求进行操作。

Object.entries({1:1, 2:2, 3:3})
      .forEach(function(v){
          console.log(v)
      });

支持仅限于文档中提到的那些浏览器版本。


1
投票

感谢最近对JavaScript的更新 - 我们现在可以解决这个问题:

function items(iterable) {
    return {
        [Symbol.iterator]: function* () {
            for (key in iterable) {
                yield [key, iterable[key]];
            }
        }
    };
}

for (const [key, val] of items({"a": 3, "b": 4, "c": 5})) {
    console.log(key, val);
}
// a 3
// b 4
// c 5

for (const [key, val] of items(["a", "b", "c"])) {
    console.log(key, val);
}
// 0 a
// 1 b
// 2 c

0
投票

ubershmekel的回答使用了懒惰的评估,与我下面的回答使用急切评估相比。懒惰评估有许多好处,在某些情况下使其更适合性能原因,但是热切评估的透明度可能是一种发展速度,可能使其在其他情况下更为可取。

const keys = Object.keys;

const values = object =>
  keys(object).map(key => object[key]);

const items = object =>
  keys(object).map(key => [key, object[key]])


obj = {a: 10, b: 20, c: 30};

keys(obj)   // ["a", "b", "c"]
values(obj) // [10, 20, 30]
items(obj)  // [["a", 10], ["b", 20], ["c", 30]]

items(obj).forEach(([k, v]) => console.log(k, v))
// a 10
// b 20
// c 30

-3
投票

不知道你想做什么,但我猜Json.stringify会做那样的事情。见http://www.json.org/js.html

© www.soinside.com 2019 - 2024. All rights reserved.