Фильтровать массив в Typescript с помощью функционального программирования [фильтр, карта, некоторые, уменьшить и т. Д.] - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь работать с функциональным программированием

У меня есть два массива

arr1=[{prodId:2}{prodId:4}]

arr2=[{id:1, name:"Test1"},
      {id:2, name:"Test2"},
      {id:3, name:"Test3"},
      {id:4, name:"Test4"},
      {id:5, name:"Test5"}]

с использованием комбинации

фильтр, карта, некоторые, уменьшить функции

Я хочу извлечь предметы из arr2

where arr2.id === arr1.prodId 

мой выходной arr будет:

  [{id:2, name:"Test2"},
  {id:4, name:"Test4"}]

Я стараюсь избегать использования forEach и использую функциональное программирование.

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Это то, что вы ищете.

arr1=[{prodId:2},{prodId:4}]

arr2=[{id:1, name:"Test1"},
      {id:2, name:"Test2"},
      {id:3, name:"Test3"},
      {id:4, name:"Test4"},
      {id:5, name:"Test5"}]


      

    let k=arr2.reduce((o,a)=>{
      if(arr1.map(a=>a.prodId).indexOf(a.id)!=-1)
      {
         o.push(a)
      }
        return o;
      },[])
console.log(k)
0 голосов
/ 18 января 2019

Решения, использующие .includes, .find или .some, - это операции с массивами и линейное время затрат. При использовании внутри .filter, другой линейной операции времени, результатом является вычисление квадратичного времени. Если входные списки велики, это влияние не является незначительным.

Вместо этого сначала соберите идентификаторы для сравнения в наборе, а затем воспользуйтесь поиском с постоянным временем в filter -

const arr1 = 
  [ { prodId: 2 }
  , { prodId: 4 }
  ]

const arr2 =
  [ { id:1, name:"Test1" }
  , { id:2, name:"Test2" }
  , { id:3, name:"Test3" }
  , { id:4, name:"Test4" }
  , { id:5, name:"Test5" }
  ]
      
const find = (whitelist, list) =>
{ const ids =
    new Set (whitelist.map(x => x.prodId)) // create a set
    
  return list.filter(x => ids.has(x.id)) // Set#has uses constant time
}

console.log(find(arr1,arr2))
// [ { id: 2, name: "Test2" }, { id: 4, name: "Test4" } ]
0 голосов
/ 18 января 2019

Вы должны использовать метод filter в сочетании с includes и map.

let arr1=[{prodId:2},{prodId:4}], arr2=[{id:1, name:"Test1"}, {id:2, name:"Test2"}, {id:3, name:"Test3"}, {id:4, name:"Test4"}, {id:5, name:"Test5"}];
let ids = arr1.map(({prodId}) => prodId);
let result = arr2.filter(({id}) => ids.includes(id));
console.log(result);

Другой подход заключается в использовании метода some.

let arr1=[{prodId:2},{prodId:4}], arr2=[{id:1, name:"Test1"}, {id:2, name:"Test2"}, {id:3, name:"Test3"}, {id:4, name:"Test4"}, {id:5, name:"Test5"}];

let result = arr2.filter(({id}) => arr1.some(({prodId}) => prodId == id));
console.log(result);
...