依赖对象类型检查 Javascript 似乎多余
Dependent Object Type Check Javascript Seems Redundant
有更好的方法吗?
如果我这样做:
if(typeof someObject[bar][foo] == "function"){
// Do something
}
我收到一个 someObject[bar][foo] is not an object
错误,如果 bar
不存在,它指的是 someObject[bar]
。这意味着代码假定您知道 someObj[bar]
已定义。所以我的解决方案是:
if(typeof someObj[bar] === "object"){
if(typeof someObject[bar][foo] == "function"){
// Do something
}
}
如果我们想努力减少代码行并编写好的、干净的、可读的代码,那么看起来是多余的和难看的。有没有更好的方法可以做到这一点而不必经过两个 if
点?我意识到这没什么大不了的,但我想知道是否有更好的方法。
if( someObject.bar && someObject.bar.foo && typeof someObject.bar.foo === "function" ){
...
}
或相同但具有更好可见性的符号样式:
if( someObject.bar
&& someObject.bar.foo
&& typeof someObject.bar.foo === "function" ){
...
}
恐怕没有简单的解释。
您希望对象在哪个 circumstance/situation 中有条件地运行?举个例子,说明我使用什么……去高级……并试图同时尽可能简单……
- 你是在循环遍历一整套类似对象的数组吗?
- 您能否信任该对象,以便您已经知道会发生什么?
- 不同数据类型的对象比较?
.[我需要一些编辑:s]
/**
* @description Get an object from a list of objects by searching for a key:value pair
* @param {Object} obj : -literal, json
* @param {String} val : the value you seek
* @param {String} key : the key
* @param {Boolean} isTypeComparison : if set to true, the key and value will be checked against it's type as well
*/
getObjectProperty: function (obj, val, key, isTypeComparison) {
var property, o;
for (property in obj) {
if (obj.hasOwnProperty(property)) {
if (typeof obj[property] === 'object') {
o = this.getObjectProperty(obj[property], val, key);
if (o) {
break;
}
} else {
// found a property which is not an object
if (isTypeComparison) {
if (property === key && obj[property] === val) {
// we got a match
o = obj;
break;
}
} else {
if (property == key && obj[property] == val) {
// we got a match
o = obj;
break;
}
}
}
}
}
return o || undefined;
},
为了给您的问题增加某种价值,在上面的所有这些循环中,您会看到与期望的斗争。我已使用此代码搜索附加到列表的 ajax 联系人列表。所以你肯定需要写更多的代码来满足深度和信任的要求。
如果您将问题概括化,您基本上是在询问是否可以验证对象中的某种 'path' 是否合法。我这样做的方法是使用一个函数,该函数接受对象和所需的 'path':
function has(obj, path){
var temp = obj;
var path = path.split('.');
for(var i = 0; i < path.length; i++){
if(temp[path[i]])
temp = temp[path[i]];//path still exists
else
return false;//path ends here
}
return true;//the whole path could be followed
}
此示例使用作为 'bar.foo' 传递的路径,但您可以轻松地针对数组 ['bar'、'foo'] 进行调整,使其成为传入参数的可变数量.
这将使您的示例成为:
if(has(someObject, bar + '.' + foo)){
if(typeof someObject[bar][foo] == "function"){
// Do something
}
}
虽然这不会具体减少此示例,但如果您有更长的搜索路径,这可能会显着减少链接在一起的 if 语句。
您可以修改该函数,使其 returns 路径指定的值应该存在而不是 true 以便您只处理一行:
function get(obj, path){
var temp = obj;
var path = path.split('.');
for(var i = 0; i < path.length; i++){
if(temp[path[i]] !== undefined)
temp = temp[path[i]];//path still exists
else
return undefined;//path ends here
}
return temp;//the whole path could be followed
}
if(typeof get(someObject, bar + '.' + foo) === 'function'){
//do something
}
有更好的方法吗?
如果我这样做:
if(typeof someObject[bar][foo] == "function"){
// Do something
}
我收到一个 someObject[bar][foo] is not an object
错误,如果 bar
不存在,它指的是 someObject[bar]
。这意味着代码假定您知道 someObj[bar]
已定义。所以我的解决方案是:
if(typeof someObj[bar] === "object"){
if(typeof someObject[bar][foo] == "function"){
// Do something
}
}
如果我们想努力减少代码行并编写好的、干净的、可读的代码,那么看起来是多余的和难看的。有没有更好的方法可以做到这一点而不必经过两个 if
点?我意识到这没什么大不了的,但我想知道是否有更好的方法。
if( someObject.bar && someObject.bar.foo && typeof someObject.bar.foo === "function" ){
...
}
或相同但具有更好可见性的符号样式:
if( someObject.bar
&& someObject.bar.foo
&& typeof someObject.bar.foo === "function" ){
...
}
恐怕没有简单的解释。
您希望对象在哪个 circumstance/situation 中有条件地运行?举个例子,说明我使用什么……去高级……并试图同时尽可能简单……
- 你是在循环遍历一整套类似对象的数组吗?
- 您能否信任该对象,以便您已经知道会发生什么?
- 不同数据类型的对象比较?
.[我需要一些编辑:s]
/**
* @description Get an object from a list of objects by searching for a key:value pair
* @param {Object} obj : -literal, json
* @param {String} val : the value you seek
* @param {String} key : the key
* @param {Boolean} isTypeComparison : if set to true, the key and value will be checked against it's type as well
*/
getObjectProperty: function (obj, val, key, isTypeComparison) {
var property, o;
for (property in obj) {
if (obj.hasOwnProperty(property)) {
if (typeof obj[property] === 'object') {
o = this.getObjectProperty(obj[property], val, key);
if (o) {
break;
}
} else {
// found a property which is not an object
if (isTypeComparison) {
if (property === key && obj[property] === val) {
// we got a match
o = obj;
break;
}
} else {
if (property == key && obj[property] == val) {
// we got a match
o = obj;
break;
}
}
}
}
}
return o || undefined;
},
为了给您的问题增加某种价值,在上面的所有这些循环中,您会看到与期望的斗争。我已使用此代码搜索附加到列表的 ajax 联系人列表。所以你肯定需要写更多的代码来满足深度和信任的要求。
如果您将问题概括化,您基本上是在询问是否可以验证对象中的某种 'path' 是否合法。我这样做的方法是使用一个函数,该函数接受对象和所需的 'path':
function has(obj, path){
var temp = obj;
var path = path.split('.');
for(var i = 0; i < path.length; i++){
if(temp[path[i]])
temp = temp[path[i]];//path still exists
else
return false;//path ends here
}
return true;//the whole path could be followed
}
此示例使用作为 'bar.foo' 传递的路径,但您可以轻松地针对数组 ['bar'、'foo'] 进行调整,使其成为传入参数的可变数量.
这将使您的示例成为:
if(has(someObject, bar + '.' + foo)){
if(typeof someObject[bar][foo] == "function"){
// Do something
}
}
虽然这不会具体减少此示例,但如果您有更长的搜索路径,这可能会显着减少链接在一起的 if 语句。
您可以修改该函数,使其 returns 路径指定的值应该存在而不是 true 以便您只处理一行:
function get(obj, path){
var temp = obj;
var path = path.split('.');
for(var i = 0; i < path.length; i++){
if(temp[path[i]] !== undefined)
temp = temp[path[i]];//path still exists
else
return undefined;//path ends here
}
return temp;//the whole path could be followed
}
if(typeof get(someObject, bar + '.' + foo) === 'function'){
//do something
}