下面这个问题:
Using the checked binding in knockout with a list of checkboxes checks all the checkboxes
我已经创建了一些复选框使用敲除,允许从一个数组中选择。
http://jsfiddle.net/NsCXJ/
有没有一种简单的方法来创建一个只包含水果ID的数组?
我更熟悉C#,我会沿着selectedFruits.select(fruit=>fruit.id);
的思路来做一些事情
是否有一些方法/现成的函数可以用javascript/jquery来做类似的事情?或者最简单的选择是循环遍历列表并创建第二个数组?我打算用JSON将数组发送回服务器,所以我试图最小化发送的数据。
8条答案
按热度按时间qvk1mo1f1#
是的,Array.map()或$.map()的功能相同。
http://jsfiddle.net/NsCXJ/1/
由于array.map较早的浏览器不支持www.example.com,所以我建议您继续使用jQuery方法。
如果你出于某种原因喜欢另一个,你可以随时添加一个polyfill来支持旧的浏览器。
您也可以随时将自定义方法添加到数组原型:
一个扩展的版本,如果你传递一个字符串,它会使用函数构造函数。
http://jsfiddle.net/aL85j/
更新日期:
由于这已经成为一个流行的答案,我添加了类似的
where()
+firstOrDefault()
。这些也可以与基于字符串的函数构造方法(这是最快的)一起使用,但这里有另一种使用对象文字作为过滤器的方法:用法:
这里有一个jsperf test来比较函数构造函数和对象文字的速度。如果你决定使用前者,请记住正确地引用字符串。
我个人的偏好是在筛选1-2个属性时使用基于对象文字的解决方案,并传递回调函数以进行更复杂的筛选。
我将以两个向本机对象原型添加方法的一般提示来结束本文:
1.在覆盖之前检查现有方法的出现情况,例如:
if(!Array.prototype.where) { Array.prototype.where = ...
1.如果你不需要支持IE8或更低版本,那么就用Object.defineProperty定义方法,使其成为不可枚举的。如果有人在数组上使用
for..in
(这首先是错误的),那么他们也会迭代可枚举属性。只是提醒一下。x6h2sr282#
我知道这是一个迟来的答案,但它对我很有用!只是为了完成,使用
$.grep
函数,你可以模拟linqwhere()
。林克:
Javascript语言:
4szc88ey3#
对ES6道:
也位于:https://jsfiddle.net/52dpucey/
cyej8jka4#
由于您使用的是knockout,因此应该考虑使用knockout实用函数
arrayMap()
及其其他数组实用函数。下面列出了数组实用程序函数及其等效的LINQ方法:
所以在你的例子中你可以这样做:
如果你想在javascript中有一个类似LINQ的接口,你可以使用一个像linq.js这样的库,它为许多LINQ方法提供了一个很好的接口。
fslejnso5#
您也可以尝试
linq.js
在
linq.js
中,您的将是
3yhwsihp6#
我已经在TsLinq.codeplex.com下为TypeScript构建了一个Linq库,你也可以用它来编写普通的javascript。这个库比Linq.js快2-3倍,并且包含了所有Linq方法的单元测试。也许你可以回顾一下这个库。
gupuwyp27#
最类似的C#
Select
类似函数是map
函数。只需用途:以从
selectedFruits
数组中选择所有ID。它不需要任何外部依赖,只需要纯JavaScript。您可以在这里找到
map
文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/mapsg3maiej8#
看一下underscore.js,它提供了许多类似linq的函数,在你给予的例子中,你将使用map函数。