【问题标题】:How to check if strings in an array contains two or more strings from a two-dimensional array?如何检查数组中的字符串是否包含来自二维数组的两个或多个字符串?
【发布时间】:2017-04-25 20:42:30
【问题描述】:

我最终想要做什么?

检查两个或多个国家/地区的国家关键字的新闻文章 JSON,并返回这些文章。

这有点复杂(至少对我来说),所以请多多包涵。

我目前正在从 API 接收新闻文章 JSON。我成功地使用下划线 _.map 来获取每个对象的描述键值。我将为关键字迭代这些值:

let combinedBing = this.bingWorldJSON.value.concat(this.bingPoliticsJSON.value);
let bingArray = _.map(combinedBing, 'description');

我正在检查我可能在另一个(动态)数组中的关键字的描述,称为事件。我为此使用 .map 方法。示例:

  let event = ["United States", "Russia"]
  let result =  event.map(function(word){
        return newArray.filter(function(article){
        // console.log(article);
        return article.toString().indexOf(word) > -1;
      });
    });

这会返回一个二维数组,如下所示:

[Array(4), Array(0)]
0:Array(4)
0:"No sign probes into Russia, Trump campaign will die down"
1:"Russian Hackers Who Targeted Clinton Appear to Attack France’s Macron"
2:"Senate Russia investigation to add 2 staffers"
3:"Former Trump adviser Flynn likely broke law with Russia trip: lawmakers"
length:4
__proto__:Array(0)
1:Array(0)
length:2
__proto__: Array(0)

但是,我不想只使用事件数组中的单词,因为它非常有限。为什么?因为返回的新闻文章并不总是使用严格的国家名称,而是经常具有语义等价物(即“U.S.”而不是“United States”,或“Russia's”而不是“Russia”)。

因为我的“事件”数组是动态创建的(并且我无法更改该数组中的严格国家名称),所以我将一个硬编码的等效关键字数组推送到另一个数组(如果该国家/地区存在于“事件”中)。因此,如果我的“事件”有

["United States, "Russia"]

我还将创建一个二维数组,如下所示:

[["United States", "U.S.", "US", "America"], ["Russia", "Russian", "Putin", "Moscow"]]

我没有使用 event.map(如上成功完成),而是试图弄清楚如何将每个数组(在二维数组中)的关键字映射到我返回的文章。不仅如此,还返回包含来自两个或多个国家/地区的关键字的文章。例如,如果一篇文章的关键字是“美国”和“莫斯科”,它将返回该文章以及包含这两个国家的关键字组合的任何其他文章。

我知道这可能看起来有点令人费解。但是因为我使用的这些 API 中没有关键字搜索,所以我尝试手动进行。

我非常感谢阅读本文所花费的耐心!感谢您提供有关如何解决此问题的任何帮助或想法。

【问题讨论】:

  • 如何将您的事件和关键字数组合并到第三个数组中,然后将 map 函数与该新数组一起使用?
  • 我会,但我认为 .map 不适用于多维数组。而且它也不会返回包含多个国家关键字的文章。我不认为。
  • 展平阵列。制作单个一维数组:["United States, "Russia", "U.S.", "US", "America", "Russian", "Putin", "Moscow"]

标签: javascript multidimensional-array ecmascript-6


【解决方案1】:

要仅获取那些提及至少两个不同国家(或其中一个替代词)的文章,则:

const bingArray = [
    "No sign probes into Russia, Trump campaign will die down",
    "Russian Hackers Who Targeted Clinton Appear to Attack France’s Macron",
    "Senate Russia investigation to add 2 staffers",
    "Former Trump adviser Flynn likely broke law with Russia trip: lawmakers",
    'Big meeting in Moscow tomorrow',
    'Russia has U.S. ambassy closed',
    'Did Putin influence the United States elections?',
];

const event = [["United States", "U.S.", "US", "America"], 
               ["Russia", "Russian", "Putin", "Moscow"]];

const matches = bingArray.filter( 
    article => event.filter( 
        words => words.find( 
            word => article.includes(word) 
        ) 
    ).length > 1
);

console.log('articles mentioning at least 2 countries:');
console.log(matches);

如果您希望只包含与 eventall 条目匹配的文章,而不仅仅是 2,则使用 every:

const bingArray = [
    "No sign probes into Russia, Trump campaign will die down",
    "Russian Hackers Who Targeted Clinton Appear to Attack France’s Macron",
    "Senate Russia investigation to add 2 staffers",
    "Former Trump adviser Flynn likely broke law with Russia trip: lawmakers",
    'Big meeting in Moscow tomorrow',
    'Russia has U.S. ambassy closed',
    'Did Putin influence the United States elections?',
];

const event = [["United States", "U.S.", "US", "America"], 
               ["Russia", "Russian", "Putin", "Moscow"]];

const matches = bingArray.filter( 
    article => event.every( 
        words => words.find( 
            word => article.includes(word) 
        ) 
    )
);

console.log('articles mentioning all listed countries:');
console.log(matches);

【讨论】:

  • 你设法让我认为非常困难的事情变得非常容易。哈哈。有用。我今天向你学习 - 非常感谢......
  • 如果我想调整它以确保每个内部数组中至少包含一个单词,我会更改长度吗?
  • 那么您将使用every(...) 而不是filter(...).length > 1。为此,我在答案中添加了一个 sn-p。
【解决方案2】:

如果是多维数组,可以使用find

let newArray = ["No sign probes into Moscow, Trump (America) campaign will die down", "Russian Hackers Who Targeted Clinton Appear to Attack France’s Macron", "Senate U.S.(United States) investigation to add 2 staffers", "Putin foo bar", "US test"];

let event = [["United States", "U.S.", "US", "America"], ["Russia", "Russian", "Putin", "Moscow"]]
let result = event.map(words => newArray.filter(article => words.find(word => article.toString().indexOf(word) > -1)));

console.log(result);

【讨论】:

    【解决方案3】:

    如果您只关心 eventKeywords 数组中包含 single 关键字的事件,则可以使用以下方法

    const events = [
      "No sign probes into Russia, Trump campaign will die down",
      "Russian Hackers Who Targeted Clinton Appear to Attack France’s Macron",
      "Senate Russia investigation to add 2 staffers",
      "Former Trump adviser Flynn likely broke law with Russia trip: lawmakers",
    ]
    const eventKeywords = [["United States", "U.S.", "US", "America", "Trump"], ["Russia", "Russian", "Putin", "Moscow"]]
    
    const myDesiredEvents = events.filter(ev => {
      return eventKeywords.filter(keywords => {
        return keywords.filter(k => ev.toString().indexOf(k) > -1).length > 0
      }).length > 0
    })
    
    // myDesiredEvents == [
    //  "No sign probes into Russia, Trump campaign will die down",
    //  "Russian Hackers Who Targeted Clinton Appear to Attack France’s Macron",
    //  "Senate Russia investigation to add 2 staffers",
    //  "Former Trump adviser Flynn likely broke law with Russia trip: lawmakers",
    //]
    

    如果您需要事件至少包含 2 个不同的关键字集,请使用以下内容(最后更改为 .length >= 2

    const events = [
      "No sign probes into Russia, Trump campaign will die down",
      "Russian Hackers Who Targeted Clinton Appear to Attack France’s Macron",
      "Senate Russia investigation to add 2 staffers",
      "Former Trump adviser Flynn likely broke law with Russia trip: lawmakers",
    ]
    const eventKeywords = [["United States", "U.S.", "US", "America", "Trump"], ["Russia", "Russian", "Putin", "Moscow"]]
    
    const myDesiredEvents = events.filter(ev => {
      return eventKeywords.filter(keywords => {
        return keywords.filter(k => ev.toString().indexOf(k) > -1).length > 0
      }).length >= 2
    })
    
    // myDesiredEvents == [
    //  "No sign probes into Russia, Trump campaign will die down",
    //  "Former Trump adviser Flynn likely broke law with Russia trip: lawmakers"
    //  ]
    

    编辑添加一个扁平化选项,代码更少,更简洁

    如果您的二维关键字数组中只需要一个匹配项,如果您将二维数组展平,它会将其转换为单个关键字数组进行检查

    const events = [
      "No sign probes into Russia, Trump campaign will die down",
      "Russian Hackers Who Targeted Clinton Appear to Attack France’s Macron",
      "Senate Russia investigation to add 2 staffers",
      "Former Trump adviser Flynn likely broke law with Russia trip: lawmakers",
    ]
    const eventKeywords = [["United States", "U.S.", "US", "America", "Trump"], ["Russia", "Russian", "Putin", "Moscow"]]
    const flattenedEventKeywords = [].concat.apply([], eventKeywords)
    // flattenedEventKeywords == ["United States", "U.S.", "US", "America", "Trump", "Russia", "Russian", "Putin", "Moscow"]
    
    const myDesiredEvents = events.filter(ev => {
      return flattenedEventKeywords.filter(keywords => {
        return ev.toString().indexOf(keywords) > -1
      }).length > 0
    })
    
    // myDesiredEvents == [
    //  "No sign probes into Russia, Trump campaign will die down",
    //  "Russian Hackers Who Targeted Clinton Appear to Attack France’s Macron",
    //  "Senate Russia investigation to add 2 staffers",
    //  "Former Trump adviser Flynn likely broke law with Russia trip: lawmakers",
    //]
    

    【讨论】:

      猜你喜欢
      • 2018-07-10
      • 2021-04-06
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 2015-09-08
      • 2021-12-14
      相关资源
      最近更新 更多