有没有办法用knockout.js或jquery返回已过滤的新对象列表。我想返回一个包含IsSelected的项目列表并从中创建一个新对象,否则我不想返回它。
return ko.utils.arrayForEach(result.items, function (item) {
if (item.IsSelected)
return {};
return false;
});
答案 0 :(得分:4)
您可以使用JQuery的filter()
函数:
return $(result.items).filter(function() {
return this.IsSelected;
});
请参阅http://api.jquery.com/filter/
更好的是,您可以使用grep()
(请参阅http://api.jquery.com/jQuery.grep/):
var arr = $.grep(result.items, function(item) {
return item.IsSelected;
});
return arr.length > 0 ? arr : false;
答案 1 :(得分:4)
你的答案都有所帮助。我在下面这样做了。
result.selected = ko.computed(function () {
return ko.utils.arrayMap(getSelectedItems(result.items()), function (item) {
return { Id: item.Id };
});
}, result);
function getSelectedItems(items) {
return ko.utils.arrayFilter(items, function (item) {
return item.IsSelected();
});
}
答案 2 :(得分:1)
jQuery.grep将迭代一个数组并根据您的条件返回一个数组。然后你需要迭代这个数组并克隆()对象以获得你想要的结果。
http://api.jquery.com/jQuery.grep/
var arr = [{foo:1, bar: 2}, {foo: 2 , bar: 3}, {foo: 10, bar: 2}];
var x = jQuery.grep(arr, function (item, i) {
return item.foo < 5;
});
//x = [{foo:1, bar:2}, {foo: 2, bar: 3}]
var y = [];
// here is the create a new object part
// clone your objects (you could use jQuery.clone() if they are elements).
x.each(function (item) {
y.push(jQuery.extend({}, $(this)));
});