Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我使用';在';对象上的关键字?_Javascript_Arrays_Typeerror - Fatal编程技术网

Javascript 我使用';在';对象上的关键字?

Javascript 我使用';在';对象上的关键字?,javascript,arrays,typeerror,Javascript,Arrays,Typeerror,我正试图为自己编写一个helper函数,以检查属性是否位于给定对象的内部。对于我自己的用例,如果我遇到一个数组,那么我只需要获得第一个(0索引)数组就可以继续。我的助手函数是返回一个布尔值,因为它只是检查所提供的字符串是否有效 鉴于目标: {'object': { "promotion": { "items": [{ "startAndEndDate": {

我正试图为自己编写一个helper函数,以检查属性是否位于给定对象的内部。对于我自己的用例,如果我遇到一个数组,那么我只需要获得第一个(0索引)数组就可以继续。我的助手函数是返回一个布尔值,因为它只是检查所提供的字符串是否有效

鉴于目标:

{'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
应该在第一次和第二次
失败时,如果出现条件并抛出错误,正确吗?感谢您的帮助!