Javascript 我使用';在';对象上的关键字?
我正试图为自己编写一个helper函数,以检查属性是否位于给定对象的内部。对于我自己的用例,如果我遇到一个数组,那么我只需要获得第一个(0索引)数组就可以继续。我的助手函数是返回一个布尔值,因为它只是检查所提供的字符串是否有效 鉴于目标:Javascript 我使用';在';对象上的关键字?,javascript,arrays,typeerror,Javascript,Arrays,Typeerror,我正试图为自己编写一个helper函数,以检查属性是否位于给定对象的内部。对于我自己的用例,如果我遇到一个数组,那么我只需要获得第一个(0索引)数组就可以继续。我的助手函数是返回一个布尔值,因为它只是检查所提供的字符串是否有效 鉴于目标: {'object': { "promotion": { "items": [{ "startAndEndDate": {
{'object': {
"promotion": {
"items": [{
"startAndEndDate": {
"startDate": "2017-11-10",
"endDate": "2017-11-29"
},
"amount": {
"discount": 12
}
}]
}
}
};
我的职能:
var propertyInObjectFuncUtil = function (string, obj) {
var substringArray = string.split('.');
if (substringArray.length) {
try {
substringArray.reduce(function (prev, curr) {
if (curr in prev) {
return prev[curr];
} else if (curr in prev[0]) {
return prev[0][curr];
} else {
throw ('These are not droids you are looking for...');
}
}, obj);
return true;
} catch (error) {
console.error(error);
return false;
}
}
};
试图使其与以下各项一起工作:
var example1 = propertyInObjectFuncUtil('object.promotion.items.amount.discount',obj) // true
var example2 = propertyInObjectFuncUtil('object.promotion.itemss',obj) // false
var example3 = propertyInObjectFuncUtil('object.promotion.items.startAndEndDate.endDates',obj) //false
然而,我得到了这个类型错误:
TypeError:无法使用'in'运算符在未定义中搜索'itemss'
带有2's'的itemss不存在,您无法迭代未定义的值
添加一个空/未定义的检查,您应该会没事。正如错误消息所说,当右侧为
未定义时,
中的运算符不能使用,它只对对象有效。因此,请为以下各项添加检查:
if (Object(prev) === prev && curr in prev) {
return prev[curr];
} else if (Array.isArray(prev) && Object(prev[0]) === prev[0] && curr in prev[0]) {
return prev[0][curr];
} else {
throw new Error('These are not droids you are looking for...');
}
使用无效路径时会出现问题。如果您的路径无效,则obj中的curr
将为false
,从而使您检查下一个条件。您的第一个示例运行良好,但您的其他示例运行不正常。在路径的多次迭代中考虑<代码> PREV 的值:
'object.promotion.itemss'
首先,prev
的开头是:
{
'object': {
"promotion": {
"items": [{
"startAndEndDate": {
"startDate": "2017-11-10",
"endDate": "2017-11-29"
},
"amount": {
"discount": 12
}
}]
}
}
}
然后检查'object'
是否在该对象中,即它,因此更新prev
下一次迭代您的prev
现在是:
{
"promotion": {
"items": [{
"startAndEndDate": {
"startDate": "2017-11-10",
"endDate": "2017-11-29"
},
"amount": {
"discount": 12
}
}]
}
}
{
"items": [{
"startAndEndDate": {
"startDate": "2017-11-10",
"endDate": "2017-11-29"
},
"amount": {
"discount": 12
}
}]
}
然后使用if的第一个条件检查'promotion'
是否在该对象中,因此更新prev
第三次迭代,prev
现在是:
{
"promotion": {
"items": [{
"startAndEndDate": {
"startDate": "2017-11-10",
"endDate": "2017-11-29"
},
"amount": {
"discount": 12
}
}]
}
}
{
"items": [{
"startAndEndDate": {
"startDate": "2017-11-10",
"endDate": "2017-11-29"
},
"amount": {
"discount": 12
}
}]
}
现在,使用if中的第一个条件,首先检查'itemss'
是否在此对象中。事实并非如此。然后检查第二个条件:
} else if (curr in prev[0]) {
问题就在这里prev[0]
正在尝试访问prev
对象(如上所示)中的键0
,但是,该键不存在,因此prev[0]
计算结果为未定义。在未定义的
中使用curr将引发错误,因为这不是
中的的有效用例。在使用IN运算符之前,考虑检查<代码> PREV(0)< /代码>是否被定义(和一个对象),如在中所示,请注意,在您的示例中,不是JSON。请考虑使用术语“对象”。@ NickParsons,“代码< > PREV < /代码>成为迭代时返回的值吗?我理解您的观点,但是<代码> PREV是一个合法的对象。因此'itemss'
a.k.a.curr
应该在第一次和第二次失败时,如果出现条件并抛出错误,正确吗?感谢您的帮助!