AngularJS解决方案,用于确定array2中是否存在数组1中的任何元素

时间:2014-07-29 17:24:42

标签: javascript arrays angularjs

我正在开发一个angularJS小部件(我的第一个),我目前正在为我的问题寻找angularJS解决方案。

基本上我有一个包含字符串值列表的数组。

var array1 = [
    "Need to Know",
    "Test Category 2",
    "News"
];

和另一个包含另一个字符串值列表

的数组
var array2 = [
    "need to know",
    "release notes",
    "NEWS"
];

如果一个数组中的任何元素与另一个数组中的任何元素匹配,我需要一个真实的语句。结果也需要不区分大小写。

这是我目前的解决方案,效果很好。

angular.module("myWidget", function(...){
    // angular code here
})
.service('arrayService', function() {
    function arrayToLowerCase(array) {
        return array.join("~!~").toLowerCase().split("~!~");
    }

    function arrayElementIsInArray(array1, array2) {
        for (var i in array1) {
            if (array2.indexOf(array1[i]) >= 0) {
                return true;
            }
        }
        return false;
    }

    function arrayCompare(array1, array2) {
        return arrayElementIsInArray(arrayToLowerCase(array1), arrayToLowerCase(array2));
    }

    return {
        arrayToLowerCase: arrayToLowerCase,
        arrayElementIsInArray: arrayElementIsInArray,
        arrayCompare: arrayCompare
    };

})

问题是我的javascript编码器(我在c#中的主要工作)觉得有更多的angularJS方法可以做到这一点,但他们没有带来什么作为一个明确的解决方案。有人建议$ filter模块可能有用,但我没看到它如何完全解决我的问题。

如果我已经有了最好的解决方案,那就太棒了。如果没有,请告诉我你的想法,让我们从那里开始。

提前致谢。

编辑:在回答一些答案时,我觉得我可能误解了我的要求。我要问的是有一个内置函数,角度提供了开箱即用的功能吗?

进一步研究之后; $ filter模块可能会使用自定义比较器实现它,但这似乎对我正在寻找的东西有点过分。

目前的回应都是好事。再次感谢!

3 个答案:

答案 0 :(得分:1)

尝试使用此尺寸。对我而言,这与Angular

无关
(function(array1, array2) {
    var tlc = function(a) { return a.toLowerCase(); };
    array2 = array2.map(tlc);
    array1 = array1.map(tlc);
    return array1.filter(function(n) {
        return array2.indexOf(n) != -1;
    }).length > 0;
})(array1, array2);

答案 1 :(得分:1)

绝对与Angular无关。这是简单的数据结构和数据操作。要说应该有更多的AngularJS方法,就像说应该有更多MVC方式来添加两个数字。

Angular不提供基本数据结构和功能集,这些功能超出了浏览器的本机数组函数列表中的功能,这取决于浏览器支持的ECMAScript标准。

您可能希望查看像Lo-Dash之类的库来查找这样的内容(您可以将它与Angular一起使用,没有任何问题),因为它可以为这些类型的数据提供经过验证的代码操纵比不断调试自己。

使用Lo-Dash,并记住不区分大小写的要求:

var array1Lowered = _.map(array1, function (value) { return value.toLowerCase(); });
var anyMatchesBool = _.any(array2, function (value) {
    return _.contains(array1Lowered, value);
});

请注意,我假设两个数组中都没有非字符串项。

Lo-Dash规范化API,因此您不必担心每个浏览器支持的功能。如果有原生功能,Lo-Dash会使用它,因为它更快。如果没有,Lo-Dash提供全JavaScript实现。

答案 2 :(得分:-1)

使用原生函数......

var intersection = array1.filter(function(n) {
    return array2.indexOf(n) != -1
});

Simplest code for array intersection in javascript

的帮助下