Как искать в массиве вложенных объектов, используя Javascript или Lodash - PullRequest
0 голосов
/ 06 января 2020

У меня есть массив объектов следующим образом:

const data = [
  {
    slug: "home",
    content_one: [],
    content_two: [
      {
        title: "Some title",
        description: 'Some description'
      }
    ],
    content_three: [
      {
        main_title: "Some title",
        content: 'Here comes some content'
      }
    ],
  },
  {
    slug: "contact",
    content_one: [
      {
        title: "Some title",
        description: 'Some description'
      }
    ],
    content_two: [],
    content_three: [],
  },
  {
    slug: "about-us",
    content_one: [],
    content_two: [],
    content_three: [],
  }
]

И у меня есть массив поисковых терминов следующим образом:

const search_terms = ['Some', 'title']

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

Результат должен быть следующим:

const res = [
    {
    slug: 'home',
    text: 'Some title',
    count: 2
  },
  {
    slug: 'contact',
    text: 'Some title',
    count: 1
  }
]

Я не уверен, как это сделать, потому что свойства вложенного массивы не одинаковы.

Это должно быть что-то вроде следующего:

let result = []
search_terms.map(term => {
    data.filter(item => {
    console.log(item)
  })
})

Но не уверен, как это сделать.

Вот скрипка .

Есть идеи?

1 Ответ

2 голосов
/ 06 января 2020

Вы можете сначала найти все объекты с соответствующим текстом, используя рекурсию, а затем выполнить подсчет и удалить дубликаты.

const data = [{"slug":"home","content_one":[],"content_two":[{"title":"Some title","description":"Some description"}],"content_three":[{"main_title":"Some title","content":"Here comes some content"}]},{"slug":"contact","content_one":[{"title":"Some title","description":"Some description"}],"content_two":[],"content_three":[]},{"slug":"about-us","content_one":[],"content_two":[],"content_three":[]}]
const search_terms = ['Some', 'title']

function search(data, terms, slug = '') {
  const result = [];

  if (data.slug) {
    slug = data.slug;
  }

  if (Array.isArray(data)) {
    data.forEach(e => result.push(...search(e, terms, slug)))
  } else {
    let added = false;
    for (let i in data) {
      if (typeof data[i] == 'object') {
        result.push(...search(data[i], terms, slug));
      } else {
        const check = terms.some(t => data[i].toLowerCase().includes(t.toLowerCase()));
        if (check && !added) {
          result.push({
            slug,
            text: data[i]
          });
          added = true;
        }
      }
    }
  }

  return result;
}

function uniq(data) {
  return data.reduce((r, e) => {
    const match = r.find(({ count, ...rest }) => _.isEqual(rest, e));
    if (match) match.count++
    else r.push({ ...e, count: 1 });
    return r;
  }, [])
}

const array = search(data, search_terms);
const result = uniq(array);

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
...