使用TypeScript在数组中查找对象
是否有一个规范的方式来find与TypeScript数组中的对象?
我知道TypeScript已经实现了很多ES6function,ES6可以做到这一点:
[{"id":1}, {"id":-2}, {"id":3}].find(myObj => myObj.id < 0) // returns {"id":-2}
但是我在TS路线图上看不到。
显然,这可以用ES5 Javascript来完成。 关键在于TypeScript正在跟踪ES6function,所以我在问是否有更好的方法,最好是上面所示的ES6例子。
第一部分 – 填充
对于尚未实现的浏览器,请使用array.find
。 致谢MDN 。
if (!Array.prototype.find) { Array.prototype.find = function(predicate) { if (this == null) { throw new TypeError('Array.prototype.find called on null'); } if (typeof predicate !== 'function') { throw new TypeError('predicate must be a function'); } var list = Object(this); var length = list.length >>> 0; var thisArg = arguments[1]; var value; for (var i = 0; i < length; i++) { value = list[i]; if (predicate.call(thisArg, value, i, list)) { return value; } } return undefined; }; }
第二部分 – 接口
您需要扩展打开的数组接口以包含find
方法。
interface Array<T> { find(predicate: (search: T) => boolean) : T; }
当它到达TypeScript时,你会从编译器得到一个警告,提醒你删除它。
第三部分 – 使用它
variablesx
将有预期的types… { id: number }
var x = [{ "id": 1 }, { "id": -2 }, { "id": 3 }].find(myObj => myObj.id < 0);
由于这个实现的问题 ,我只是用这个replace了这个Array.prototype.find扩展
let result = [{id:1}, {id:-2}, {id:3}].filter(item => item.id < 0)[0];
您可能会添加特定的行为重载,例如,如果您知道只能find一个实体。
编辑 :正如Mohsen所说,在打字机上有更多的经验之后,在我看来,玩tsconfig.json就是答案。 您也可以像这样定位es5:
{ "compilerOptions": { "experimentalDecorators": true, "module": "commonjs", "target": "es5" } ...
对于某些项目,在tsconfig.json
目标设置为es6
更容易。
{ "compilerOptions": { "target": "es6", ...
你可以使用下划线库。
安装它:
npm install underscore --save npm install @types/underscore --save-dev
导入它
import _ = require('underscore');
用它
var x = _.filter( [{ "id": 1 }, { "id": -2 }, { "id": 3 }], myObj => myObj.id < 0) );
如果您需要escript不支持的es6改进,您可以在您的tsconfig中定位es6并使用Babel转换es5中的文件。