Фильтровать объект, если свойство соответствует значению в массиве - PullRequest
0 голосов
/ 05 декабря 2018

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

const faultGroup = 
[{
  comments:"",
  faults:
   [{
     id:31,
     name: "speaker"
    },
    {
     id:22
     name: "earphones"
    },
    {
     id:25
     name: "keyboard"
    }];
}];

И у меня есть массив, который содержит массив с идентификатором

idArray = [25,22];

Предполагаемый результат:

result = ["earphones", "keyboard"];

Текущее решение:

result = [];
faultGroup.map(fg => {
  if (!!fg.faults) {
     fg.faults.forEach(fault => {
         for (let i = 0; i < idArray.length; i++) {
            if (idArray[i] === fault.id) {
                this.result.push(fault.name);
            }
         }
     });
   }
});

Могу ли я узнать наиболее эффективный способ сделать это?(не уверен, как использовать фильтр и метод в этом случае). В настоящее время я использую комбинацию map и double для циклов.Ценю вашу помощь!

Ответы [ 6 ]

0 голосов
/ 05 декабря 2018

JSON.parse и JSON.stringify могут использоваться для проверки всех пар ключ-значение:

var result = [], idArray = [25,22], faultGroup = [{ comments:"", faults: [
{ id:31, name: "speaker" }, { id:22, name: "earphones" }, { id:25, name: "keyboard" }] }];

JSON.stringify(faultGroup, (k, v) => idArray.includes(v.id) ? result.push(v.name) : v);

console.log( result );
0 голосов
/ 05 декабря 2018

Вы можете использовать Array.reduce и Array.filter и Array.includes, чтобы получить результат:

const data = [{ comments: "", faults: [{ id: 31, name: "speaker" }, { id: 22, name: "earphones" }, { id: 25, name: "keyboard" } ] }]
const ids = [25,22];

const result = data.reduce((r,{faults}) => 
  [...r, ...faults.filter(({id}) => ids.includes(id)).map(x => x.name)], [])

console.log(result)

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

0 голосов
/ 05 декабря 2018

var faultGroup = 
[{
  comments:"",
  faults:
   [{
     id:31,
     name: "speaker"
    },
    {
     id:22,
     name: "earphones"
    },
    {
     id:25,
     name: "keyboard"
    }]
}];
idArray = [25,22];

var res = faultGroup.map( f => f["faults"].filter( a => idArray.indexOf(a.id) > -1 ).map( r => r.name ) );

console.log(res);
0 голосов
/ 05 декабря 2018

С возможным грядущим Array#flatMap, вы можете использовать отображение с выравниванием в одном цикле, взяв нужные элементы.

const
    faultGroup = [{ comments: "", faults: [{ id: 31, name: "speaker" }, { id: 22, name: "earphones" }, { id: 25, name: "keyboard" }] }],
    idArray = [25, 22],
    result = faultGroup.flatMap(({ faults }) => faults
        .filter(({ id }) => idArray.includes(id))
        .map(({ name }) => name)
    );
  
console.log(result);
0 голосов
/ 05 декабря 2018

Это также работает.

let result = [];

faultGroup.forEach(({ faults }) => {
  faults
    .filter(({ id }) => idArray.indexOf(id) > -1)
    .forEach(fault => result.push(fault));
});
0 голосов
/ 05 декабря 2018

Вы можете reduce над массивом faultGroup, извлекая массив faults из каждого элемента и итерируя по нему, нажимая на аккумулятор, если id включено в idArray:

const faultGroup = [{
  comments: "",
  faults: [{
      id: 31,
      name: "speaker"
    },
    {
      id: 22,
      name: "earphones"
    },
    {
      id: 25,
      name: "keyboard"
    }
  ]
}];
const idArray = [25,22];
const result = faultGroup.reduce((a, { faults }) => {
  if (faults) faults.forEach(({ id, name }) => {
    if (idArray.includes(id)) a.push(name);
  });
  return a;
}, []);
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...