gpt4 book ai didi

javascript - 针对所有另一个数组过滤数组

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:32:31 25 4
gpt4 key购买 nike

$scope.categories 数组是从 AngularJS 中的多选元素填充的。

$scope.categories = ["Adventure", "Strategy"]

我需要将此数组与下面项目数组中的类别数组进行比较:

$scope.items = [
{
title: "Star Wars",
categories: ["Adventure"]
}, {
title: "Star Search",
categories: ["Adventure", "Strategy"]
}, {
title: "Star Trek",
categories: ["Adventure", "Family"]
}, {
title: "Star Wars",
categories: ["Family", "Strategy"]
}];

$scope.categories 中的两个值需要与 $scope.items.categories 中的相同值匹配,以便将对象推送到输出数组。

生成的 $scope.filtered 数组为(项目 1 ):

{
title: "Star Search",
categories: ["Adventure", "Strategy"]
}

我有逻辑,直到循环需要重申......但是如何?

  1. 我正在遍历 $scope.categories
  2. 然后遍历 $scope.items
  3. 然后遍历每个对象的 $scope.item.categories 数组。
  4. 然后我将 $scope.categories 值与 $scope.item.categories

    的值进行比较
    for (var i = 0; i < categories.length; i++) {
    for (var j = 0; j < items.length; j++) {
    for (var k = 0; k < items[j].categories.length; k++) {
    if(categories[i] == items[j].categories[k]) {
    console.log("The value of " + categories[i] + ", matches " + items[j].categories[k]);
    } else {
    console.log("The value of " + categories[i] + ", is not a match");
    }
    }
    }
    }

这是一个JSbin例子

最佳答案

其实更简单:

var filtered = items.filter(function(i) {
return categories.every(function(c) {
return i.categories.indexOf(c) >= 0
})
})

Array.prototype.filter迭代数组并为每个项目调用回调函数。回调函数返回 true 的每个项目都包含在结果数组中。

Array.prototype.every迭代数组并为每个项目调用回调函数,如果所有项目的回调返回 true,则返回 true,否则返回 false。

在这个用例中,我们过滤项目数组,当所有类别“通过”every 回调条件时,过滤器回调返回 true,即项目类别包含当前 (c) 类别。

(这是固定的 JSBin )

关于javascript - 针对所有另一个数组过滤数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31711194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com