0

有没有办法使用 knockout.js 或 jquery 返回过滤后的新对象列表。我想返回具有 IsSelected 的项目列表并从中创建一个新对象,否则我不想返回它。

return ko.utils.arrayForEach(result.items, function (item) {
    if (item.IsSelected)
        return {};
    return false;
});
4

3 回答 3

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;
于 2012-04-20T19:45:34.527 回答
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();
        });
    }
于 2012-04-20T20:47:33.663 回答
1

jQuery.grep 将迭代一个数组并根据您的条件返回一个数组。然后你需要迭代这个数组并 clone() 对象以获得你想要的结果。

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)));
});
于 2012-04-20T19:50:26.623 回答