【问题标题】:Using .includes method in a function在函数中使用 .includes 方法
【发布时间】:2017-06-08 19:32:15
【问题描述】:

我有一个对象jsonRes[0],其中包含需要根据条件删除的值。以下工作可删除字符串化对象中的null、缺失值和等于零的值:

function replacer(key, value) {
          // Filtering out properties
          if (value === null || value === 0 || value === "") {
            return undefined;
          }
          return value;
        } 

JSON.stringify(jsonRes[0], replacer, "\t")

但是,当我使用 includes 方法添加条件时,我收到一个错误:

function replacer(key, value) {
          // Filtering out properties
          if (value === null || value === 0 || value === "" || value.includes("$")) {
            return undefined;
          }
          return value;
        } 


Uncaught TypeError: value.includes is not a function

为什么会出现这种情况,是否有解决方法?

【问题讨论】:

  • 如果该值未定义,则表示它没有类似包含函数的东西
  • 如果你查看includes() :developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…的文档,大多数浏览器不支持这个属性。 stackoverflow.com/questions/31340868/… 使用 toString() 将属性转换为字符串后,您可以使用广泛支持的 indexOf():
  • 好吧,如果value 是一个数字、(非数组)对象或布尔值,它不会有.includes 方法吗?大概你打算写typeof value == "string" && value.includes("$")之类的东西。

标签: javascript


【解决方案1】:

我通过附加“.toString();”解决了这个错误,我在将“includes”应用于“window.location”值时遇到了这个错误

var requestUrl = window.location.toString();

if (requestUrl.includes(urlBase + "#")) { ...

【讨论】:

    【解决方案2】:

    .includes() API 是 StringArray 数据类型的一部分。

    所以错误试图告诉你的是变量 value 的值,例如整数或对象,不具有属性.includes

    你可以做类似的检查

    1. typeof a_string === 'string'
    2. an_array instanceof Array

    .includes() api 之前防止这种情况发生。

    显然,由于您拥有的检查数量,这会使您的 if 语句相当难看。

    根据您的代码编写方式,我怀疑您对检查“字符串”比检查数组更感兴趣。所以小心数组。如果是数组,您的代码可能无法正常工作。

    无论如何,这里是您的代码的重构版本。

    function replacer(key, value) {
       // Filtering out properties
       if (!value || typeof value === "string" && value.includes("$")) {
            return undefined;
       }
       return value;
     } 
    
    console.log("NULL returns:" + replacer('test', null));
    console.log("$Test returns:" + replacer('test', '$test'));
    console.log("Blah returns:" + replacer('test', 'Blah'));

    【讨论】:

    • 这个答案应该是接受答案的第二部分的一部分。 '还要注意...'
    【解决方案3】:

    您可以使用String.indexOf() 代替String.includes,因为它在 ES6 中可用,而在 IE 中根本不支持。

    typeof value == "string" && value.indexOf('$') > -1
    

    还要注意,如果value 不是字符串类型,它仍然会引发错误booleanNumber 不是该方法。您可以使用typeof 来验证value 是否为字符串。

    【讨论】:

      【解决方案4】:

      还有一种可能性:也许您的value 不是字符串类型的对象。

      (typeof(value) == "string" && value.includes("$"))

      【讨论】:

        【解决方案5】:

        其实我并不确定名为value 的变量是什么类型,但无论如何,Array.prototype.includesString.prototype.includes 仅在 ES6 中可用。您需要使用babel-polyfill 或任何其他捆绑模块,如rollup.jswebpack 和babel 或类似的东西才能使用includes 函数。

        【讨论】:

          猜你喜欢
          • 2019-04-13
          • 1970-01-01
          • 2020-12-21
          • 1970-01-01
          • 2019-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-21
          相关资源
          最近更新 更多