【问题标题】:Angular filter that compares an array of strings in ng-repeating objects - with an array of strings, and filters out objects that do not matchAngular 过滤器,将 ng-repeating 对象中的字符串数组与字符串数组进行比较,并过滤掉不匹配的对象
【发布时间】:2015-07-27 00:29:51
【问题描述】:

这个 Angular 过滤器被传递给一个 ng-repeat 中使用的对象数组(item in items)。

    [{
        title: "Star Wars",
        categories: ["Adventure", "Family"]
    }, {
        title: "Star Search",
        categories: ["Realty", "Fantasy"]
    }, {
        title: "Star Trek",
        categories: ["Sci-Fi", "Fantasy"]
    }]


还有一个字符串数组(categoriesFiltered)

    ["Adventure", "Sci-Fi"]


遍历 ng-repeat 中的 items 并将 categories 数组...与 categoriesFiltered 数组进行比较的最佳方法是什么,并将匹配的 items 推送到新的 filtered 数组?


这就是我已经走了多远

categoryFilter.filter('filterCategories', function () {
    return function (items, categoriesFiltered) {
        var filtered = [];

        for (var i = 0; i < items.length; i++) {
            for (var j = 0; j < items[i].categories; j++) {
                if (filtered.indexOf(items[i].categories[j]) === -1) {
                    filtered.push(items[i]);
                };
            };
        };
        return filtered;
    };
});

这里是plunker...

【问题讨论】:

  • 方法看起来很合理......它有效吗?有些人可能会使用Array.prototype.filter()Array.prototype.map()
  • 我会研究这些方向...谢谢@charlietfl
  • 如果它有效则没有真正的需要...for循环运行良好...是否有问题?如果这只是一个代码审查问题,最好在codereview.stackexchange.com 上问那些问题这里的问题是针对实际问题的
  • 道歉@charlietfl - 我没有回答你的问题,for循环不能正常工作
  • 您能在plunker 中为此制作一个简单的演示吗?不需要任何 CSS 或任何花哨的东西

标签: javascript arrays angularjs angularjs-ng-repeat angularjs-filter


【解决方案1】:

有一些问题。

  1. 您返回的filtered 数组在返回的函数之外,它应该在里面。
  2. 您没有在 for 循环条件中检查 items[i].categories.length
  3. 您使用错误的数组来检查indexOf
  4. 我假设您的 categoriesFiltered 示例是拼写错误,看起来像 ["Adventure", "Sci-Fi"],因为 [{"Adventure", "Sci-Fi"}] 是无效的 javascript。

试试这个:

categoryFilter.filter('filterCategories', function () {
    return function (items, categoriesFiltered) {
        var filtered = [];

        for (var i = 0; i < items.length; i++) {
            for (var j = 0; j < items[i].categories.length; j++) {
              if (categoriesFiltered.indexOf(items[i].categories[j]) > -1) {
                filtered.push(items[i]);
              }
            }
        }
        return filtered;
    };
});

【讨论】:

  • 1.是的,它在外面……已编辑。 2. 用日志检查。 3. 与谷歌核实。 4. 是的,这是一个错字……已编辑。谢谢@user2341963
  • 是的 @user2341963... 我知道 2 和 3 哪里错了。过滤器现在正在工作,很好 - 谢谢
猜你喜欢
  • 2021-12-15
  • 2019-04-04
  • 1970-01-01
  • 2015-03-24
  • 2020-08-15
  • 2021-10-23
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多