在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吗?
如果没有扩展您不想要的Object.prototype,就不能像在python中那样执行此操作,因为它是痛苦的路径。
您可以轻松地创建一个辅助函数,它可以循环遍历对象并将值放入数组中,但是,如下所示:
function items(obj) {
var i, arr = [];
for(i in obj) {
arr.push(obj[i]);
}
return arr;
}
Ps:JSON是一种数据格式,你拥有的是一个对象文字。
在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)
});
支持仅限于文档中提到的那些浏览器版本。
感谢最近对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
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
不知道你想做什么,但我猜Json.stringify会做那样的事情。见http://www.json.org/js.html