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

Можете ли вы использовать любой из стандартных способов?

typeof( MyClass );

MyClass c = new MyClass();
c.GetType();

Если нет, вам нужно будет добавить информацию в Type.GetType о сборке.

2
задан ir2pid 18 January 2019 в 17:44
поделиться

3 ответа

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

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
ответ дан Shubh Dixit 18 January 2019 в 17:44
поделиться

Решения, использующие .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" } ]
[1110 ]
0
ответ дан user633183 18 January 2019 в 17:44
поделиться

Вы должны использовать метод 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);

0
ответ дан Mihai Alexandru-Ionut 18 January 2019 в 17:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: