фильтровать вложенный массив с Javascript - PullRequest
0 голосов
/ 21 апреля 2020

имея массив с объектами и внутри массива опций, как фильтровать внутренний массив объектов по значению ключа?

Вот следующий пример:

let test = [{
  "options": [{
     "label": "Audi",
     "value": 10
   },
    {
     "label": "BMW",
     "value": 18
   },
   {
     "label": "Mercedes Benz",
     "value": 116
   },
   {
     "label": "VW",
     "value": 184
   }
 ],
 "label": "test1"
},
{
 "options": [{
    "label": "Adler",
    "value": 3664
  },
  {
    "label": "Alfa Romeo",
    "value": 3
  },
  {
    "label": "Alpine",
    "value": 4
  }
],
 "label": "test2"
}
]

как мне вернуть объект:

 {
   "label": "Audi",
   "value": 10
 }

, если я отфильтрую по ключевому слову Audi

return label.toLowerCase().includes(inputValue.toLowerCase());

Я попытался со следующим

test.map((k) => {
              res = k.options.filter((j) => {
                inputValue.toLowerCase();
                if (j.label.toLowerCase().includes(inputValue.toLowerCase())) {
                  return j;
                }
              });
            });

Ответы [ 5 ]

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

Используйте flatMap(), затем filter():

let test=[{options:[{label:"Audi",value:10},{label:"BMW",value:18},{label:"Mercedes Benz",value:116},{label:"VW",value:184}],label:"test1"},{options:[{label:"Adler",value:3664},{label:"Alfa Romeo",value:3},{label:"Alpine",value:4}],label:"test2"}]

let result = test.flatMap(el => {
    return el.options.filter(car => car.label == "Audi")
})[0]

console.log(result)
1 голос
/ 21 апреля 2020

При обходе массива вам нужно go на два уровня глубины.

function filterArray(needle, haystack) {
  return haystack
    .map(h => h.options)
    .flatMap(h => h )
    .filter(h => h.label.toLowerCase().includes(needle.toLowerCase()));

CodeSandbox

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

Это вернет все параметры, соответствующие поисковому запросу:

function find(array, query) {
  return array.reduce((prev, current) => prev.concat(current.options), []).filter(item => item.label.includes(query))
}

find(test, 'Audi')
1 голос
/ 21 апреля 2020

Вам нужно вернуть результат filter(), а не просто присвоить его переменной, чтобы map() вернул результаты.

let test = [{
    "options": [{
        "label": "Audi",
        "value": 10
      },
      {
        "label": "BMW",
        "value": 18
      },
      {
        "label": "Mercedes Benz",
        "value": 116
      },
      {
        "label": "VW",
        "value": 184
      }
    ],
    "label": "test1"
  },
  {
    "options": [{
        "label": "Adler",
        "value": 3664
      },
      {
        "label": "Alfa Romeo",
        "value": 3
      },
      {
        "label": "Alpine",
        "value": 4
      }
    ],
    "label": "test2"
  }
]
let inputValue = "audi";
let search = inputValue.toLowerCase();
let result = test.map(k => k.options.filter(j => j.label.toLowerCase().includes(search)));
console.log(result);
0 голосов
/ 21 апреля 2020

Это может дать ответ на ваш вопрос:

console.log (test [0] .options [0]);

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