【问题标题】:JavaScript: Find in array all values with substrings of arrayJavaScript:在数组中查找所有带有数组子字符串的值
【发布时间】:2020-02-02 06:41:54
【问题描述】:

我有两个数组;一个带有子字符串,另一个带有对象。

我想获得一个对象数组,其中这些对象包含子字符串数组中的任何子字符串。

到目前为止,我已经尝试使用filterfindIndex。如果子字符串相同,则每种方法都有效。在这种情况下,即使indexOf 也不起作用。我不是 javascript 人,所以可能我做错了什么。

脚本

  var strings = ['12', 'sv', 'eli', '23', '34'];

  var data = [
    {
      a: 349531284734,
      b: "sv123eippppppeli",
      c: "aaabbbccc"
    },
    {
      a: 1111123333312,
      b: "ccccccccccccs2222",
      c: "aaabbbccc"
    },
    {
      a: 2222234,
      b: "elllllllla",
      c: false
    },
  ];


  // attempt 1

  var results = data.filter(arr =>
    Object.keys(arr).some(key => {
      return String(arr[key]).toLowerCase().includes(strings) // or indexOf
    })
  );


  // attempt 2 with only one data index

  var obj = Object.values(data[0]);
  var results = strings.some(s => obj.includes(s)) // or indexOf or findIndex;

说明

在这个给定子字符串的例子中,只有data[0] 是匹配的,因为它至少包含strings 数组中的一个子字符串。

如何在不使用“for 循环”的情况下完成这项工作?

谢谢

【问题讨论】:

  • 给定输入的预期输出是什么?
  • 它需要返回匹配的对象。因此,如果数据包含数组中的字符串,则需要返回。如果 substring 是 ['aa', 'bb'] 而 object 是 {a: 1, b: "oo", c: "aabb"} 它需要返回那个对象。
  • developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 虽然如此,但 String.prototype.includes 期望参数是另一个字符串,而不是字符串数组
  • @Taplar include 也应该可以工作,正如 Dacre Denny 在回答中所证明的那样。
  • @Taplar 啊,是的。对不起。我的错误

标签: javascript object filter include indexof


【解决方案1】:

避免使用“for-loop”语法的简单解决方案是通过谓词检查filter() 的每个对象data,该谓词检查任何值(被过滤的当前项目的)是否包含任何一个strings 数组的值。

在代码中,可以表示为:

var strings = ['12', 'sv', 'eli', '23', '34'];

var data = [{
    a: 349531284734,
    b: "sv123eippppppeli",
    c: "aaabbbccc"
  },
  {
    a: 1111123333312,
    b: "ccccccccccccs2222",
    c: "aaabbbccc"
  },
  {
    a: 2222234,
    b: "elllllllla",
    c: false
  },
];

// Local helper retruns true if case-insenstive value in strings array
const stringHasValue = (value) => strings
  .some(str => value.toLowerCase().includes(str.toLowerCase()))

// Filter each item in data array by existance of a value containing
// substring in strings array
var result = data.filter((item) => Object.values(item)
  .filter(value => typeof value === 'string')
  .some(stringHasValue, []));

console.log(result);

【讨论】:

  • 太棒了。我很接近,但没那么接近。再次感谢。
  • 您的代码唯一的问题是,如果我在输入类型上创建子字符串数组并且在创建启动代码之后,它会以某种方式重置并且旧值被忽略。 var strings = this.value.toLowerCase().split(' ').filter(Boolean) 但我认为这有点离题了。
猜你喜欢
  • 2018-08-18
  • 2017-04-07
  • 1970-01-01
  • 2012-06-28
  • 2022-12-15
  • 2017-01-02
  • 1970-01-01
  • 2019-03-10
  • 2015-09-11
相关资源
最近更新 更多