【问题标题】:includes() not returning true for substring包含()不为子字符串返回true
【发布时间】:2021-03-08 19:46:34
【问题描述】:

如果关键字是子字符串,我无法弄清楚为什么此函数不返回结果。

const string = 'cake';
const substring = 'cak';
console.log(string.includes(substring));
// returns true

但是当我在这里尝试做类似的事情时,我没有得到我期望的结果。

function filterByKeyword(array, keyword) {
  return array.filter((x) =>
    x.keywords
      .map(function(x) {
        return x.toLowerCase();
      })
      .includes(keyword.toLowerCase())
  );
};

const array = [{
    "id": 1014,
    "keywords": [
      "Sesame Street",
      "Cake",
      "Party",
      "Birthday"
    ]
  },
  {
    "id": 1015,
    "keywords": [
      "Sesame Street",
      "Party",
      "Birthday"
    ]
  }
];

console.log(filterByKeyword(array, 'cak'))
// returns []

console.log(filterByKeyword(array, 'cake'))
// returns an array with the correct object

我做错了什么?

【问题讨论】:

  • 数组包含 !== 字符串包含 ["sesame street", "cake", "party", "birthday"].includes("cak")
  • 要跟进@epascarello 所说的内容,您需要检查每个 字符串.includes() 是否是子字符串,而不是整个 数组。

标签: javascript arrays


【解决方案1】:

您可以使用Array#some 来检查数组中是否有任何字符串包含关键字。

function filterByKeyword(array, keyword) {
  return array.filter((x) => 
     x.keywords.some(w=>w.toLowerCase().includes(keyword.toLowerCase()))
  );
};

const array = [
{
  "id":1014,
  "keywords":[
     "Sesame Street",
     "Cake",
     "Party",
     "Birthday"
  ]
},
{
  "id":1015,
  "keywords":[
     "Sesame Street",
     "Party",
     "Birthday"
  ]
}];

console.log(filterByKeyword(array, 'cak'))

【讨论】:

    【解决方案2】:

    字符串包含与数组包含不同。数组包含需要完全匹配的索引。这不是部分匹配。有几种方法可以做到这一点。最简单的就是将数组变成一个字符串并寻找匹配项

    const array = [
    {
      "id":1014,
      "keywords":[
         "Sesame Street",
         "Cake",
         "Party",
         "Birthday"
      ]
    },
    {
      "id":1015,
      "keywords":[
         "Sesame Street",
         "Party",
         "Birthday"
      ]
    }];
    
    function find(partial) {
      return array.filter(function (obj) {
         return obj.keywords.join(",").toLowerCase().includes(partial)
      });
    }
    
    console.log(find('cak'));

    其他选项是使用 some()

    const array = [{
        "id": 1014,
        "keywords": [
          "Sesame Street",
          "Cake",
          "Party",
          "Birthday"
        ]
      },
      {
        "id": 1015,
        "keywords": [
          "Sesame Street",
          "Party",
          "Birthday"
        ]
      }
    ];
    
    function find(partial) {
      return array.filter(function(obj) {
        return obj.keywords.some(function(txt) {
          return txt.toLowerCase().includes(partial);
        })
      });
    }
    
    console.log(find('cak'));

    【讨论】:

      【解决方案3】:

      您实际上是在将includes() 函数应用于数组而不是字符串,这就是问题所在。 这里我使用 reduce 来达到这个目的。

      function filterByKeyword(array, keyword) {
        return array.filter((x) =>
            x.keywords
                .reduce(function (result ,x) {
                    return result + x.toLowerCase().includes(keyword.toLowerCase())
                }, false)
                
      
        );
      };
      
      const array = [{
          "id": 1014,
          "keywords": [
            "Sesame Street",
            "Cake",
            "Party",
            "Birthday"
          ]
        },
        {
          "id": 1015,
          "keywords": [
            "Sesame Street",
            "Party",
            "Birthday"
          ]
        }
      ];
      
      console.log(filterByKeyword(array, 'cak'))
      // returns [{...}]
      
      console.log(filterByKeyword(array, 'cake'))
      ///return [{...}]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-20
        • 1970-01-01
        • 1970-01-01
        • 2015-05-02
        • 2013-08-17
        • 1970-01-01
        相关资源
        最近更新 更多