Можете ли вы использовать любой из стандартных способов?
typeof( MyClass );
MyClass c = new MyClass();
c.GetType();
Если нет, вам нужно будет добавить информацию в Type.GetType о сборке.
Это то, что вы ищете.
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)
Решения, использующие .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" } ]
Вы должны использовать метод 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);