使用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中的文件。