var data = {
'id': 'object1',
'sceneCapability': {
'updatedAt': '2017-06-19T20:52:45.688Z'
'currentScene': {
'value': {
'number': 1,
'name': '1'
}
},
'outOfTune': {
'value': false
}
},
'lightingCapability': {
'intensity': {
'value': 0
}
},
'tiltCapability': {
'command': {
'value': 'NO'
},
'position': {
'value': 0
}
}
// like this I have different types of more than 20 Capabilities
};
如何编写通用方法来解析此Object?我需要获得currentScene
值,outOfTune
,intensity
,command
,position
等等。
有时我只获得一项功能,有时我获得了20多项功能。
我想避免做这样的事情,因为将来可能有数百种不同的功能
if (obj.lightingCapability && obj.lightingCapability.intensity) {
console.log(obj.lightingCapability.intensity.value)
}
if (device.sceneCapability && device.sceneCapability.outOfTune) {
// do something
}
输出我想要
currentScene:1,
outOfTune: false,
intensity: 0,
command: 'NO',
position: 0
答案 0 :(得分:4)
这样的事情对你有用吗?
一个辅助函数,它找到你需要的属性,如果链上的任何东西都不存在,则返回null。我添加了两个不同的'版本,以防你不喜欢属性名称数组。
var object = {
a: {
b: {
c: {
d: 10
}
}
}
};
function getValue(object, propertyPath) {
var o = object;
var pLen = propertyPath.length;
for (var i = 0; i < pLen; i++) {
var propertyName = propertyPath[i];
if (!o.hasOwnProperty(propertyName))
return undefined;
o = o[propertyName];
}
return o;
}
function getValueFromString(object, path) {
return this.getValue(object, path.split('.'));
}
console.log(getValue(object, ['a', 'b', 'c', 'd'])); //logs 10
console.log(getValueFromString(object, 'a.b.c.d')); //logs 10
console.log(getValue(object, ['a', 'b', 'c', 'e'])); //logs undefined
答案 1 :(得分:3)
根据我在第一个回答的评论中的讨论,我意识到你的意思不同。这应该可以解决问题:
var object = {
a: {
b: {
c: {
value: 10
},
d: {
e: {
value: 20
}
}
}
}
};
function logAllValues(object) {
for (var p in object) {
var o = object[p];
if (o.value)
console.log(p + ': ' + o.value);
else
logAllValues(o);
}
}
logAllValues(object); //logs c:10 and e:20
答案 2 :(得分:1)
执行此操作的一种稍微晦涩的方法是创建一个帮助函数,该函数允许将键链作为字符串传递并在其上循环。例如
function getValue(obj, keyChain){
var keys = keyChain.split('.');
do {
var key = keys.shift();
if (!obj.hasOwnProperty(key)){
return undefined;
}
obj = obj[key];
} while (keys.length > 0);
return obj;
}
getValue(data, "lightingCapability.intensity.value")
答案 3 :(得分:0)
我认为您只需要安装lodash#get
var get = require('lodash.get');
if(get('foo.baz.foobaz')) {
alert('yep');
}
但您需要事先了解所需的所有paths
。
重新实施这种经过社区测试的方法将最终重新发明轮子,所以,只需安装并使用它。
答案 4 :(得分:-1)
你可以使用ES6 try和catch block来实现这样的东西
bcrypt.genSalt(10, function(err,salt){
if (err){
return console.log('error in hashing the password');
}
bcrypt.hash(pass, salt, function(err,hash){
if (err){
return console.log('error in hashing #2');
} else {
console.log('hash of the password is ' + hash);
console.log(pass);
storehash = hash;
console.log(storehash);
db.create({
email: req.body.email,
username: req.body.username,
password: storehash,
}, function(err, User){
if (err){
console.log('error in creating user with authentication');
} else {
console.log('user created with authentication');
console.log(User);
}
}); //db.create
}
});
});
//像这样使用
getValue(()=&gt; object.a.b); //返回Object {c:Object,d:Object}
getValue(()=&gt; object.a.b.c); //返回Object {value:10}
getValue(()=&gt; object.a.b.x); //返回undefined