在Typescript中,我经常使用这个模式:
class Vegetable {
constructor(public id: number, public name: string) {
}
}
var vegetable_array = new Array<Vegetable>();
vegetable_array.push(new Vegetable(1, "Carrot"));
vegetable_array.push(new Vegetable(2, "Bean"));
vegetable_array.push(new Vegetable(3, "Peas"));
var id = 1;
var collection = vegetable_array.filter( xvegetable => {
return xvegetable.id == id;
});
var item = collection.length < 1 ? null : collection[0];
console.info( item.name );
我正在考虑创建一个类似于LINQ SingleOrDefault
方法的JavaScript扩展,如果它不在数组中,则返回null
:
var item = vegetable.singleOrDefault( xvegetable => {
return xvegetable.id == id});
我的问题是,是否有另一种方法来实现这一点,而无需创建一个自定义界面?
4条答案
按热度按时间4szc88ey1#
您可以始终以这种方式使用Array.prototype.filter:
编辑
我的答案适用于
FirstOrDefault
,而不是SingleOrDefault
。SingleOrDefault
检查是否只有一个匹配,在我的例子中(在你的代码中),你返回第一个匹配,而不检查另一个匹配。顺便说一句,如果你想实现
SingleOrDefault
,那么你需要改变这一点:进入
h9a6wy2h2#
如果你想在数组中找到一个元素,我建议你使用ES6 find method,像这样:
它更快,更容易阅读,因为你不需要写
collection[0]
。顺便说一下,如果C#的
SingleOrDefault
找到多个元素,它会抛出一个异常。lf3rwulv3#
如果不需要重用,可以通过应用一个简单的reduce函数来实现
singleOrDefault
:在这种情况下reducer函数只在数组不为空时计算,当长度大于1时抛出,否则返回唯一的元素。当数组为空时,返回reduce函数的默认值参数:在这种情况下为
null
。例如:
blmhpbnm4#
你可以使用reduce来做到这一点: