JavaScript: Найти в массиве все значения с подстроками массива - PullRequest
1 голос
/ 04 октября 2019

у меня есть два массива;один с подстрокой, а другой с объектами.

Я хотел бы получить массив объектов, где эти объекты содержат любую из подстрок в массиве substrings.

До сих пор я пытался использоватьfilter и findIndex. Каждый подход работает, если подстрока идентична. В этом случае даже 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?

Спасибо

1 Ответ

1 голос
/ 04 октября 2019

Простое решение, позволяющее избежать необходимости использования синтаксиса "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);
...