我有一种情况需要将两个对象压缩在一起,同时保留两个值。我可以迭代这两个对象并构建一个包含所有键的数组。
var traverse = function (obj, chain) {
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
var tempChain = [].concat(chain || []);
tempChain.push(prop);
if (typeof obj[prop] === 'object') {
traverse(obj[prop], tempChain);
}
console.log(tempChain);
}
}
};
传递以下内容:
traverse({
'a': {
'b': 'hello world',
'b1': 'hello world 1',
'c': {
'd': 'dello'
}
}
})
会回复我:
[a]
[a,b]
[a,b1]
[a,c]
[a, c, d]
所以我现在在对象中有一个嵌套属性数组。我怎样才能访问obj [[a,c,d]]?我知道我可以通过eval解决问题,但我不相信内容。
eval('window.' + ['a','c','d'].join('.'));
如果我可以循环遍历该数组并检查它们是否同时存在,那么构建一个组合“zipped”值的新对象。
答案 0 :(得分:1)
也许是这样的?
function getValueAt(obj, keyPathArray) {
var emptyObj = {};
return keyPathArray.reduce(function (o, key) {
return (o || emptyObj)[key];
}, obj);
}
然后你就可以使用它:
var o = { a: { c: { d: 1 } } };
getValueAt(o, ['a', 'c', 'd']); //1
然而,对于不存在的属性来说效率不高,因为它不会短路。
这是另一种不使用reduce
的方法:
function getValueAt(o, keyPathArray) {
var i = 0,
len = keyPathArray.length;
while (o != null && i < len) o = o[keyPathArray[i++]];
return o;
}