var obj = {
name: "Simon",
age: "20",
clothing: {
style: "simple",
hipster: false
}
}
for(var propt in obj){
console.log(propt + ': ' + obj[propt]);
}
propt
如何表示对象的属性?它不是内置方法或属性。为什么它出现在对象的每个属性中?< /p>
var obj = {
name: "Simon",
age: "20",
clothing: {
style: "simple",
hipster: false
}
}
for(var propt in obj){
console.log(propt + ': ' + obj[propt]);
}
propt
如何表示对象的属性?它不是内置方法或属性。为什么它出现在对象的每个属性中?< /p>
如果您正在运行Node,我建议:
Object.keys(obj).forEach((key, index) => {
console.log(key);
});
尽管顶级答案是正确的,但这里有一个备用用例,即如果您正在迭代对象并想在最后创建数组。 使用.map
而不是forEach
const newObj = Object.keys(obj).map(el => {
//ell will hold keys
// Getting the value of the keys should be as simple as obj[el]
})
var example = {
"prop1": "value1",
"prop2": [ "value2_0", "value2_1"],
"prop3": {
"prop3_1": "value3_1"
}
}
迭代 'properties' 的错误方式:
function recursivelyIterateProperties(jsonObject) {
for (var prop in Object.keys(example)) {
console.log(prop);
recursivelyIterateProperties(jsonObject[prop]);
}
}
prop1
、prop2
和prop3_1
的属性时,在控制台记录了0
、1
等。这些对象是序列,而序列的索引在Javascript中是该对象的属性。function recursivelyIterateProperties(jsonObject) {
for (var prop in Object.keys(example)) {
console.log(prop);
if (!(typeof(jsonObject[prop]) === 'string')
&& !(jsonObject[prop] instanceof Array)) {
recursivelyIterateProperties(jsonObject[prop]);
}
}
}
function iterate(obj) {
// watch for objects we've already iterated so we won't end in endless cycle
// for cases like var foo = {}; foo.bar = foo; iterate(foo);
var walked = [];
var stack = [{obj: obj, stack: ''}];
while(stack.length > 0)
{
var item = stack.pop();
var obj = item.obj;
for (var property in obj) {
if (obj.hasOwnProperty(property)) {
if (typeof obj[property] == "object") {
// check if we haven't iterated through the reference yet
var alreadyFound = false;
for(var i = 0; i < walked.length; i++)
{
if (walked[i] === obj[property])
{
alreadyFound = true;
break;
}
}
// new object reference
if (!alreadyFound)
{
walked.push(obj[property]);
stack.push({obj: obj[property], stack: item.stack + '.' + property});
}
}
else
{
console.log(item.stack + '.' + property + "=" + obj[property]);
}
}
}
}
}
使用方法:
iterate({ foo: "foo", bar: { foo: "foo"} });
for...in循环的作用是创建一个新变量(var someVariable),并将给定对象的每个属性依次存储在这个新变量(someVariable)中。因此,如果使用代码块 {},可以进行迭代。请考虑以下示例。
var obj = {
name:'raman',
hobby:'coding',
planet:'earth'
};
for(var someVariable in obj) {
//do nothing..
}
console.log(someVariable); // outputs planet
obj[someVariable]
。也许它被踩得那么多的原因是因为它不是递归的。所以如果你有一个高度结构化的对象,这不是一个足够好的解决方案。 - Katharine Osborne在这里,我正在遍历每个节点并创建有意义的节点名称。如果你注意到,instanceOf Array和instanceOf Object基本上做相同的事情(在我的应用程序中,我提供了不同的逻辑)。
function iterate(obj,parent_node) {
parent_node = parent_node || '';
for (var property in obj) {
if (obj.hasOwnProperty(property)) {
var node = parent_node + "/" + property;
if(obj[property] instanceof Array) {
//console.log('array: ' + node + ":" + obj[property]);
iterate(obj[property],node)
} else if(obj[property] instanceof Object){
//console.log('Object: ' + node + ":" + obj[property]);
iterate(obj[property],node)
}
else {
console.log(node + ":" + obj[property]);
}
}
}
}
注意 - 我受到了Ondrej Svejdar答案的启发,但这个解决方案性能更好,且不那么含糊。
var Dictionary = {
If: {
you: {
can: '',
make: ''
},
sense: ''
},
of: {
the: {
sentence: {
it: '',
worked: ''
}
}
}
};
function Iterate(obj) {
for (prop in obj) {
if (obj.hasOwnProperty(prop) && isNaN(prop)) {
console.log(prop + ': ' + obj[prop]);
Iterate(obj[prop]);
}
}
}
Iterate(Dictionary);
您可以通过以下方式检查属性如何表示对象属性:
typeof propt
发现它只是一个字符串(属性名称)。这是由于for-in
js“内置”循环的工作方式导致对象中的每个属性都会出现。
var obj = {
name: "Simon",
age: "20",
clothing: {
style: "simple",
hipster: false
}
}
for(var propt in obj){
console.log(typeof propt, propt + ': ' + obj[propt]);
}
var object = Object.create(null)
实例化对象,则object.hasOwnProperty(property)
将触发TypeError。因此为了安全起见,您需要像这样从原型调用它:for (var property in object) {
if (Object.prototype.hasOwnProperty.call(object, property)) {
// do stuff
}
}
如果您只想迭代映射属性值,那么 Lodash 有 _.mapValues
const obj = {
a: 2,
b: 3
}
const res = _.mapValues(obj, v => v * 2)
console.log(res)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>