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

时间:2011-03-17 11:58:33

标签: javascript associative-array

在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吗?

5 个答案:

答案 0 :(得分:3)

你不能像在python中那样执行此操作而不扩展你不想做的Object.prototype,因为它是痛苦的路径。

你可以很容易地创建一个辅助函数,它可以遍历对象并将值放入一个数组中,但是这样:

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

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

答案 1 :(得分: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元组的不变性。显然,如果你把它拿出来它仍然有效。

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

另一种新方法是使用Object.entries()来完全按照自己的意愿行事。

items

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

答案 2 :(得分: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 :(得分:-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

答案 4 :(得分:-3)

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