2015-09-25 115 views
0

我有对象的名称循环遍历多个对象的所有键一次?

['obj','obj2','objN'] 

这些对象是目标节点

{ 
    obj: { 
    key: value, 
    key2: value, 
    } 
    obj2:{ 
    key3: value 
    } 
... 
} 

我知道,我的一个目标,我可以做的数组:

for (var key in obj) { 
    if (obj.hasOwnProperty(key)) { 
    console.log(key) 
    } 
} 

但是否有可能循环遍历多个对象的所有键而不做任何重复?

+0

循环数组,使用数组键和*初始对象*属性名称。 –

+0

如果您只关心按键,无论发生什么值,都可以将这些对象合并在一起,然后遍历该对象的按键。 –

+0

什么是初始对象属性名称? – Himmators

回答

1

假设与形式的父容器对象:

var parentObj = 
{ 
    obj: { 
     key: value, 
     key2: value, 
    } 
    obj2: { 
     key3: value 
    } 
    ... 
} 

此外,如果我们要包括的每个子键只有一次, 我们

var objNameArray = ['obj','obj2','objN']; 
var allValues = []; 
var usedKeys = {}; 

for(var i = 0; i < objNameArray.length; ++i){ 
    // If the parent object does not have a matching sub-object, skip to the 
    // next iteration of the loop 
    if(!parentObj[objNameArray[i]]) { 
     continue; 
    } 
    var currentObj = parentObj[objNameArray[i]]; 
    var subKeys = Object.keys(currentObj); 
    for(var j = 0; j < subKeys.length; ++j) { 
     if(usedKeys[subKeys[j]]) { 
      continue; 
     } 
     usedKeys[subKeys[j]] = true; 
     allValues.push(currentObj[subKeys[j]]); 
    } 
} 

所有值从所有的按键在每个子对象中将会出现在数组allValues中,并且通过调用Object.keys(usedKeys);可以获得每个子对象的所有键。请注意,如果子对象也可以有子对象,则需要调整此策略以支持递归。

0

如果正确地解释问题,尝试利用Object.keys()

var data = { 
 
    obj: { 
 
    key: 1, 
 
    key2: 2, 
 
    }, 
 
    obj2:{ 
 
    key3: 3 
 
    } 
 
}; 
 

 
for (var key in data) { 
 
    console.log(Object.keys(data[key])) 
 
}

+0

不会运行相同的密钥多次,如果他们存在于obj和obj2? – Himmators

+0

@Himmators是否需要返回唯一键?或者,如果'obj2'具有'key2',那么不会返回'key2'作为结果的一部分? ,因为之前在'obj'迭代的'key2'?预期的结果是什么? – guest271314