Javascript 将对象键值迭代为数组
我试图理解迭代类似数组的对象:Javascript 将对象键值迭代为数组,javascript,Javascript,我试图理解迭代类似数组的对象: var obj = {0:'a',1:'b'} function logArgs(){ Array.prototype.forEach.call(arguments,function(elem,idx){ console.log(idx + '. ' + elem); }) } //now calling this fails: logArgs(obj) //logs 0. [object object] 但我想要这样的结果: 0. a 1. b var
var obj = {0:'a',1:'b'}
function logArgs(){
Array.prototype.forEach.call(arguments,function(elem,idx){
console.log(idx + '. ' + elem);
})
}
//now calling this fails:
logArgs(obj)
//logs
0. [object object]
但我想要这样的结果:
0. a
1. b
var obj = {'0':'a', '1':'b'};
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
// property name is in prop
// value is in obj[prop]
console.log(prop + ": " + obj[prop]);
}
}
function logArgs(){
Array.prototype.forEach.call(arguments,function(elem,idx){
console.log("argument " + idx);
Object.keys(elem).forEach(function(key) {
console.log(" key " + key + ": " + elem[key]);
});
})
}
我会使用
Object.keys()
请参阅
在OP的函数中使用相同的逻辑
var obj = {0:'a',1:'b'}
function logArgs(obj){
var keys = Object.keys(obj);
keys.forEach(function(key){
console.log(key + '. ' + obj[key]);
});
}
logArgs(obj)
日志:
我会使用
Object.keys()
请参阅
在OP的函数中使用相同的逻辑
var obj = {0:'a',1:'b'}
function logArgs(obj){
var keys = Object.keys(obj);
keys.forEach(function(key){
console.log(key + '. ' + obj[key]);
});
}
logArgs(obj)
日志:
对象属性的通常迭代如下所示:
0. a
1. b
var obj = {'0':'a', '1':'b'};
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
// property name is in prop
// value is in obj[prop]
console.log(prop + ": " + obj[prop]);
}
}
function logArgs(){
Array.prototype.forEach.call(arguments,function(elem,idx){
console.log("argument " + idx);
Object.keys(elem).forEach(function(key) {
console.log(" key " + key + ": " + elem[key]);
});
})
}
工作演示:
请记住(根据语言规范),对象的属性没有任何保证的顺序,所有属性名称都是字符串值
不能像数组那样直接迭代对象(即使对象的属性为0、1、2…n),因为它没有
.length
属性。您可以(虽然我不知道为什么这会有用),使用object.keys()
将对象的属性提取到一个数组中,然后将其用于迭代,但我不清楚为什么这些都有用,而不仅仅是比所需的代码复杂得多
var obj = {'0':'a', '1':'b'};
Object.keys(obj).forEach(function(prop) {
console.log(prop + ": " + obj[prop]);
});
除非您想为键提供自定义排序,否则我看不出有任何理由这样做
Object.keys()
还需要IE9或更高版本。对象属性的通常迭代如下:
0. a
1. b
var obj = {'0':'a', '1':'b'};
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
// property name is in prop
// value is in obj[prop]
console.log(prop + ": " + obj[prop]);
}
}
function logArgs(){
Array.prototype.forEach.call(arguments,function(elem,idx){
console.log("argument " + idx);
Object.keys(elem).forEach(function(key) {
console.log(" key " + key + ": " + elem[key]);
});
})
}
工作演示:
请记住(根据语言规范),对象的属性没有任何保证的顺序,所有属性名称都是字符串值
不能像数组那样直接迭代对象(即使对象的属性为0、1、2…n),因为它没有
.length
属性。您可以(虽然我不知道为什么这会有用),使用object.keys()
将对象的属性提取到一个数组中,然后将其用于迭代,但我不清楚为什么这些都有用,而不仅仅是比所需的代码复杂得多
var obj = {'0':'a', '1':'b'};
Object.keys(obj).forEach(function(prop) {
console.log(prop + ": " + obj[prop]);
});
除非您想为键提供自定义排序,否则我看不出有任何理由这样做
Object.keys()
还需要IE9或更高版本。要迭代传递给函数的每个对象参数的键,您需要如下内容:
0. a
1. b
var obj = {'0':'a', '1':'b'};
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
// property name is in prop
// value is in obj[prop]
console.log(prop + ": " + obj[prop]);
}
}
function logArgs(){
Array.prototype.forEach.call(arguments,function(elem,idx){
console.log("argument " + idx);
Object.keys(elem).forEach(function(key) {
console.log(" key " + key + ": " + elem[key]);
});
})
}
对于示例对象,这将记录
argument 0
key 0: a
key 1: b
请注意,通过对象属性名的迭代顺序,可以是
for。。。在
中或使用Object.keys()时,未在JavaScript中定义。运行时环境可以在您请求密钥时按随机顺序自由地移交密钥。当然,它们没有,但编写依赖于此的代码是一个坏主意。要迭代传递给函数的每个对象参数的键,您需要如下内容:
0. a
1. b
var obj = {'0':'a', '1':'b'};
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
// property name is in prop
// value is in obj[prop]
console.log(prop + ": " + obj[prop]);
}
}
function logArgs(){
Array.prototype.forEach.call(arguments,function(elem,idx){
console.log("argument " + idx);
Object.keys(elem).forEach(function(key) {
console.log(" key " + key + ": " + elem[key]);
});
})
}
对于示例对象,这将记录
argument 0
key 0: a
key 1: b
请注意,通过对象属性名的迭代顺序,可以是for。。。在
中或使用Object.keys()时,未在JavaScript中定义。运行时环境可以在您请求密钥时按随机顺序自由地移交密钥。当然,它们没有,但编写依赖于此的代码是一个坏主意。它不是一个类似数组的对象,因为它缺少一个关键特性。length
属性
要在对象上迭代,可以使用以下代码:
for (var key in obj) {
// Protect against inherited properties.
if (obj.hasOwnProperty(key)) {
console.log(key, obj[key]);
}
}
在ES5中,您可以执行以下操作:
Object.keys(obj).forEach(
function(key) {
var val = obj[key];
console.log([key, val]);
}
);
重要注意事项
- 这两种方法都不能保证按数组顺序返回值。它可能返回
李>[1,0]
- 正如@jfriend00所提到的,属性名是字符串。(数组也是如此,但数组往往会对您隐藏这一事实。)
length
属性
要在对象上迭代,可以使用以下代码:
for (var key in obj) {
// Protect against inherited properties.
if (obj.hasOwnProperty(key)) {
console.log(key, obj[key]);
}
}
在ES5中,您可以执行以下操作:
Object.keys(obj).forEach(
function(key) {
var val = obj[key];
console.log([key, val]);
}
);
重要注意事项
- 这两种方法都不能保证按数组顺序返回值。它可能返回
李>[1,0]
- 正如@jfriend00所提到的,属性名是字符串。(数组也是如此,但数组往往会对您隐藏这一事实。)
参数
;为什么您希望记录不止一件事情?它是loggin[object],但我希望是0。我知道您希望它是什么,但关键是您的代码在参数列表上迭代,而不是在每个参数的内容上迭代。但这就是我问这个问题的原因,谢谢你澄清:)但你刚刚通过了一个论点。您的函数迭代参数
;为什么您希望记录不止一件事情?它是loggin[object],但我希望是0。我知道您希望它是什么,但关键是您的代码在参数列表上迭代,而不是在每个参数的内容上迭代。但这就是我问这个问题的原因,所以感谢您的澄清:)您的第二个选项将生成类似0,0
和1,1
的输出。必须返回到实际对象才能获取属性值。@jfriend00 Arg,是。我专注于正确的语法,但没有检查输出。谢谢现在修复。您的第二个选项将生成输出,如0,0
和1,1
。必须返回到实际对象才能获取属性值。@jfriend00 Arg,是。我专注于正确的语法,但没有检查输出。谢谢现在修好。