jquery / knockout.js并返回一个已过滤的新对象数组

时间:2012-04-20 19:33:39

标签: jquery arrays knockout.js

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

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

3 个答案:

答案 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)));
});