0

需要在 JSON 数组中搜索文本字符串。

Bixby 中的事实/笑话模块目前按标签而不是全文搜索。我想修改过滤功能来搜索全文字段。

目前,过滤器功能是这样的。

exports.findContentJS = findContentJS
function findContentJS (items, searchTerm) {
  var matches = items.filter(function (x) {
    if (x.tags) {
      // Filter on filter 
      var matchTag = x.tags.filter(function (y) {
        return y == searchTerm
      });
      return (matchTag != "");
    }
  });
  return matches;
}

我尝试将“标签”更改为“文本”。

因此,对于“马克吐温”的搜索,我收到如下错误消息:

类型错误:在对象中找不到函数过滤器 银行家是这样的人,他在阳光明媚的时候借给你他的雨伞,并在开始下雨的那一刻想要回来。资料来源:马克吐温

这是json文件中对应的对象:

{
  tags: ["literature"],
  text: "A banker is a fellow who lends you his umbrella when the sun is shining and wants it back the minute it begins to rain. Source: Mark Twain"
}

所以在我看来,我需要对函数进行可能的小改动,以便它同时搜索数组中的标签和文本字段。

4

3 回答 3

2

.text 不是数组,所以不会有过滤功能

只需使用

exports.findContentJS = findContentJS
function findContentJS (items, searchTerm) {
    var matches = items.filter(function (x) {
        return x.includes(searchTerm);
    });
    return matches;
}

或者,

exports.findContentJS = findContentJS
const findContentJS = (items, searchTerm) => items.filter(x => x.includes(searchTerm));
于 2019-08-08T21:44:17.737 回答
1

试试这个(可能会出现小错误,因为在睡前写这个):

let findContent = (jsonArr, searchedItem) => {
   let arr = [];
   jsonArr.forEach(obj => {

  for(let content in obj) {
    if(content == 'text'){
      let filtered = obj[content].split(' ').filter(el => el == searchedItem);
      if(filtered){
        arr.push(obj[content]);
      }
    }
  }
return arr;
}
于 2019-08-08T20:38:50.927 回答
0

我最终完成了这项工作,这是由 Bixby 团队的一名成员提供的。

function findContent (items, searchTerm, searchAuthor) {
  var matches = []
  //searchTerm = searchTerm.toLowerCase()
  console.log(searchTerm)
  console.log(searchAuthor)
  ;

  for (var i = 0; i < items.length; i++) {
    if (items[i].text.includes(searchTerm)) { //change with substring or any other kind of a matching you need
        matches.push(items[i])
    } else if (items[i].tags) {
      for (var j = 0; j < items[i].tags.length; j++) {
        if (searchTerm == items[i].tags[j].toLowerCase()) {
          matches.push(items[i])
          break
        }
      }
    }
  }
  return matches
}
于 2019-08-12T18:32:54.237 回答