Javascript 迭代创建的动态对象
Javascript Iterate on Dynamic Object Created
这是我的代码。问题在代码行
中说明
<script>
// sample data created
var names = ['egard', 'roger'];
// object k is populated with a key and dynamic values
// depending on the list of names
// declare a new object
var k = {};
// create k properties according to names data
for (var i = 0; i < names.length; i++) {
if (k.hasOwnProperty(names[i])) {
k[names[i]] = false;
} else {
// value is dynamic, can be a number, char
// that will be used for other purposes
Object.defineProperty(k, names[i], {
value : true,
writable : true
});
}
};
// using jquery
$.each(k, function (i, me) {
// its not going here
console.log('jquery', me);
});
// using native iteration
for (var i in k) {
// its not going here
console.log('native', k[i]);
}
// what i want is to go inside the block
// of $.each or for ()
// so that i could iterate the object
// keys and its assign value
console.log(k);
// will output
Object {egard: true, roger: true}
console.log(k.egard);
// will output
// true
</script>
问题出在您对 Object.defineProperty
的使用上。默认情况下,它将创建 non-enumerable 属性,顾名思义,您的循环无法枚举这些属性。只需将 enumerable
属性 添加到定义中即可:
Object.defineProperty(k, names[i], {
value : true,
writable : true,
enumerable : true
});
这里是 working version。
您应该谨慎对待这两个键值,因为它们默认为 false
:
可配置
当且仅当此 属性 描述符的类型可以更改并且 属性 可以从相应的对象中删除时才为真。
默认为假。
可枚举
当且仅当此 属性 在相应对象的属性枚举期间出现时才为真。
默认为假。
这是我的代码。问题在代码行
中说明<script>
// sample data created
var names = ['egard', 'roger'];
// object k is populated with a key and dynamic values
// depending on the list of names
// declare a new object
var k = {};
// create k properties according to names data
for (var i = 0; i < names.length; i++) {
if (k.hasOwnProperty(names[i])) {
k[names[i]] = false;
} else {
// value is dynamic, can be a number, char
// that will be used for other purposes
Object.defineProperty(k, names[i], {
value : true,
writable : true
});
}
};
// using jquery
$.each(k, function (i, me) {
// its not going here
console.log('jquery', me);
});
// using native iteration
for (var i in k) {
// its not going here
console.log('native', k[i]);
}
// what i want is to go inside the block
// of $.each or for ()
// so that i could iterate the object
// keys and its assign value
console.log(k);
// will output
Object {egard: true, roger: true}
console.log(k.egard);
// will output
// true
</script>
问题出在您对 Object.defineProperty
的使用上。默认情况下,它将创建 non-enumerable 属性,顾名思义,您的循环无法枚举这些属性。只需将 enumerable
属性 添加到定义中即可:
Object.defineProperty(k, names[i], {
value : true,
writable : true,
enumerable : true
});
这里是 working version。
您应该谨慎对待这两个键值,因为它们默认为 false
:
可配置 当且仅当此 属性 描述符的类型可以更改并且 属性 可以从相应的对象中删除时才为真。 默认为假。
可枚举 当且仅当此 属性 在相应对象的属性枚举期间出现时才为真。 默认为假。