фильтровать вложенный массив объектов на основе значений объектов Javascript ES6 - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь отфильтровать массив объектов ниже переменной search, которая является строкой.Таким образом, пользователь может искать по названию, году или имени людей

array = [{
    "title": "Test",
    "year": 2018,
    "people": [
      {
        "name": "person1"
      },
      {
        "name": "person2"
      }],
  },
  {
    "title": "Test2",
    "year": 2018,
    "people": [
      {
        "name": "person3"
      },
      {
        "name": "person4"
      },
      {
        "name": "person5"
      }],
   },...]

Я написал следующую функцию, которая прекрасно работает для заголовка и года , но яне мог понять, как искать массив people внутри функции.Я знаю, как это сделать без ES6, но я предпочитаю ES6, который все еще сбивает меня с толку:

filteredArray() {
            let search = this.search.toLowerCase();
            return this.array.filter(function (item) {
                    return Object.values(item).some(val =>
                        String(val).toLowerCase().includes(search));
            })
        },

this.search - это v-model, в котором хранятся значения, введенные пользователями. Вот это Codepen

Я ценю вашу помощь:)

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Следующий код поможет вам использовать

   var searchString = 'person5';

   let result = array.filter(ele => 
    ele.title.includes(searchString)
    || `${ele.year}`.includes(searchString)
    || ele.people.some(pele => pele.name.includes(searchString))
   )
   console.log(JSON.stringify(result));
0 голосов
/ 19 сентября 2019

Создать карту / хэш строк поиска для удобного поиска:

const array = [{
"title": "Test",
"year": 2018,
"people": [
  {
    "name": "person1"
  },
  {
    "name": "person2"
  }],
  },
  {
"title": "Test2",
"year": 2018,
"people": [
  {
    "name": "person3"
  },
  {
    "name": "person4"
  },
  {
    "name": "person5"
  }],
   }];


let map = array.reduce((map,item,i)=>{
  let values = Object.values(item);
  let persons = values.pop().map(e=>e.name);
  [...values,...persons].forEach(e=>map.set(String(e).toLowerCase(),i))
  return map;
},new Map());

//console.log(...map);
['person1','person3','Test2'].forEach(e=>console.log({[e]:array[map.get(String(e).toLowerCase())]}))

Для Vue попробуйте

filteredArray() {
    let search = this.search.toLowerCase();
    let arr2d = this.arr2d;
    if(typeof arr2d ==="undefined"){
     arr2d = this.array.reduce((arr,item)=>{
      let values = Object.values(item);
      let persons = values.pop().map(e=>e.name);
      arr.push([...values,...persons]);
      return arr;
     },[]);
    }
    return this.array.filter((item,i)=>arr2d[i].some(el=>
        String(el).toLowerCase().includes(search)))
    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...