Фильтровать вложенные массивы - PullRequest
1 голос
/ 09 марта 2019

const array = [{ "title": "Carros", "data" : [{ "nome": "Mustang" }, {"nome": "Camaro"}]}];
   
let filteredArray = array
  .filter((element) => 
element.data.some((subElement) => subElement.nome == "Mustang"))
  .map(element => {
return Object.assign({}, element, {nome : element.data.filter(subElement => subElement.nome == "Mustang")});
  }); 

filteredArray всегда возвращает один и тот же массив, но с дочерним элементом "nome".

Я хочу найти слова «mus», «tang», «mustang» или «mu» и вернуть:

[{ "title": "Carros", "data" : [{ "nome": "Mustang" }]}];

то же самое, если у меня есть другой столбец, такой как:

[{ "title": "Carros", "data" : [{ "nome": "Mustang" }]},
{ "title": "Motos", "data" : [{ "nome": "Yamaha }]}];

и поиск "mustang" должен вернуть:

const array = [{ "title": "Carros", "data" : [{ "nome": "Mustang" }]},
{ "title": "Motos", "data" : [] }];

Мне нужно сохранить ту же структуру, но изменить только вложенные «данные».

Ответы [ 3 ]

0 голосов
/ 09 марта 2019
const array = [{ "title": "Carros", "data" : [{ "nome": "Mustang" }]},
{ "title": "Motos", "data" : [{ "nome": "Yamaha" }]}];

function filterStuff(array, deepname) {
    return array.map(element => ({
        ...element,
        data: element.data.filter(deepElement => deepElement.nome === deepname)
    }))
}

console.log(JSON.stringify(filterStuff(array, "Mustang")));

// Output:
// [{"title":"Carros","data":[{"nome":"Mustang"}]},{"title":"Motos","data":[]}]

Это дает вам метод для вызова фильтра по этому глубокому элементу и немного чище.

0 голосов
/ 12 марта 2019

Если можно использовать Lodash + Deepdash , то вы можете сделать:

// filter by Mustang(no empty categories)
let res = _.filterDeep(data,(v)=>_.includes(v.nome,"Mus"),{tree:{children:"data"}});

// get all empty categories
let structure = _.omitDeep(data,/\.data.+/);

_.merge(structure,res);
console.log(structure);

Вот Codepen для этого

0 голосов
/ 09 марта 2019
  let array = [{ title: "Carros", data: [{ nome: "Mustang" }, {nome: "Camaro"}]}];
function Query(data) {


    let newData = [...array[0].data].filter((x,i) => x.nome === data)
    array = [{...array[0],data: newData }]
    console.log(array);
}
Query("Mustang")

Я не знаком с машинописью, но вот немного ванили JS

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