Как отфильтровать массив объектов, отфильтровав внутри него массив в javascript - PullRequest
1 голос
/ 25 апреля 2020

Я пытаюсь выполнить расширенный поиск своего приложения, в нем есть массив объектов, каждое хранилище - это объект, а в каждом магазине - массив объектов, в котором хранятся элементы этого хранилища (каждый элемент является объект). (я оставлю массив store, чтобы вы поняли, что я имею в виду)

Итак, я хочу, чтобы пользователь отфильтровал магазины по именам элементов, но я застрял, и все, что я пытался, не показалось работать. вот код:

массив массивов:

let stores = [
  {
    name:"",
    type:"",
    items:[
      {name:"tomato", quantity:"145", unit:"g"},  //this is what i want to filter with
      {name:"other items here", quantity:"45", unit:"kg"},
      {name:"example item", quantity:"74", unit:"l"},
    ]
  }
]

Способ фильтрации, который я пробовал:

let userInput = "tomato";


//this outputs the original array without any filtering

    let filteredStores = stores.filter(store=>{
      return store.items.filter(item=>{
        return item.name.includes(userInput)
      })
    })

Надеюсь, кто-то понимает, как я хочу отфильтровать магазины спасибо

Ответы [ 3 ]

2 голосов
/ 25 апреля 2020

Array#filter вернет пустой массив, если совпадений не найдено. Это истинное значение, вы можете найти это, выполнив !!array.filter(() => false). Вам нужно вызвать .length на втором фильтре, чтобы определить, найдены ли какие-либо совпадения, 0 неверно, а все остальное верно.

1 голос
/ 25 апреля 2020

Вы можете попробовать это:

let stores = [
  {
    name:"",
    type:"",
    items:[
      {name:"tomato", quantity:"145", unit:"g"},  //this is what i want to filter with
      {name:"other items here", quantity:"45", unit:"kg"},
      {name:"example item", quantity:"74", unit:"l"},
    ]
  },
 {
    name:"",
    type:"",
    items:[
      {name:"tomatos", quantity:"14", unit:"kg"},
    ]
  }
];

let UserInput = "tomato";

const res = stores.filter(({items}) => items.find(item => item.name.includes(UserInput)));

console.log(res);
.as-console-wrapper{min-height: 100%!important; top: 0}
1 голос
/ 25 апреля 2020

let stores = [
  {
    name:"",
    type:"",
    items:[
      {name:"tomato", quantity:"145", unit:"g"},  //this is what i want to filter with
      {name:"other items here", quantity:"45", unit:"kg"},
      {name:"example item", quantity:"74", unit:"l"},
    ]
  }
]

let filterdStores = stores.filter(s=>s.items.some(i=>i.name==='tomato'));

console.log(JSON.stringify(filterdStores,null,2));

Эффективное использование Array.some

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