通过排除每个数组中不存在的值来过滤n个数组

时间:2011-01-25 17:44:42

标签: javascript jquery arrays

我有 n 数组,我需要确定 x 是否在所有 n 数组中。 (其中 n 是任何数字,而 x 是一个数值)我有类似下面的内容,但总是错误。

function filterArrays()
{
  var x = $(this).attr('id'); // ex: 2
  var arrays = [[1,2,3],[2,4,6]];
  var result = false;
  for each (var n in arrays)
  {
    result = result ^ (n.indexOf(x) > -1);
  }
}

result位于两个数组中时,如何使true等于x,但当x不在两个数组中时,请result相等到false

上面的函数将与jQuery的filter()方法一起使用。例如:

$(arrayOfElementsWithNumericIds).filter(arrayFilter);
// arrayOfElementsWithNumericIds prototype: [div#1,div#2,div#3,...]

我认为需要按位操作,但我可能错了。请解释为什么您的解决方案是正确的以及为什么我的解决方案不起作用。 (奖励积分)

6 个答案:

答案 0 :(得分:3)

以下是您的示例的一些问题:

  • 将数字与字符串进行比较(id是字符串)。使用x = parseInt(...)
  • 使用^运算符。而是将result初始化为true并使用&&
  • 摆脱each。正确的语法是for (key in object)

我尽可能少地修改了你的代码:

function filterArrays()
{
    var x = parseInt($(this).attr('id')); // ex: 2
    var arrays = [[1,2,3],[2,4,6]];
    var result = true;
    for (var n in arrays)
    {
        result = result && (arrays[n].indexOf(x) > -1);
    }
    return result;
}

话虽如此,您可以使用Array.every()Array.some()来优化代码。此外,使用$(this).attr('id')会不必要地创建一个jQuery对象,因为您可以直接说出this.id

function filterArrays()
{
    var x = parseInt(this.id); // ex: 2
    var arrays = [[1,2,3],[2,4,6]];
    var result = arrays.every(function(array)
    {
        return array.some(function(item)
        {
            return item === x;
        });
    });
    return result;
}

答案 1 :(得分:1)

我认为你正在寻找这个:

  var result = true;
 for each (var n in arrays)
  {
    result = result && (n.indexOf(x) > -1);
  }

也就是说,假设该值在所有要启动的数组中。然后使用AND(&&)运算符

  true AND (value is in current array)

如果值在任何时候都不在数组中,则它变为false,整个操作将为false。否则它将一直存在,直到循环结束。

答案 2 :(得分:1)

xor不是要走的路。以这种方式看待它:

search for 2, start  result = false
1st array: 2 is present, result = false xor true = true
2nd array: 2 is present, result = true xor true = false
end: result is false (WRONG)

search for 4, start result = false
1st array: 4 is present, result = false xor true = true
2nd array: 4 is  absent, result = true xor false = true
end: result is true (WRONG)

你想要一个累积的累积和。

start: result = true, search for 2
1st array: 2 is present, result = true and true = true
2nd array: 2 is present, result = true and true = true
end: result is true (RIGHT)

start: result = true, search for 4
1st array: 4 is present, result = true and true = true
2nd array: 4 is absent, result = true and false = false
end: result if false (RIGHT)

答案 3 :(得分:0)

为什么不使用contains方法扩展数组原型?这样你就可以循环遍历每个数组和/或当前结果与前一个数组。

答案 4 :(得分:0)

如果需要,可以循环遍历'数组'对象,但是,我认为你只需要一个Set Intersect操作。这是在jQuery中执行此操作的一种方法,并且它不关心x的attr(id)值是整数还是字符串。我正在吃午饭,我会在一页快速测试...

function filterArrays(){
  var x = $(this).attr("id");
  var arrays = [[1,2,3],[2,4,6]];
  var result = ($.inArray(arrays[0], x )>0 && $.inArray(arrays[1], x) >0);
  return result;
}

答案 5 :(得分:0)

使用http://phrogz.net/JS/ArraySetMath.js你可以:

var sets  = [[1,2,3],[2,3,7],[1,7,2]];
var isect = sets[0];
for (var i=1,len=sets.length;i<len;++i){
  isect = isect.intersection( sets[i] );
}
console.log( isect );
// [2]

或者,使用JS.Set你可以:

var sets  = [[1,2,3],[2,3,7],[1,7,2]];

// Or JS.HashSet or JS.Set
var isect = new JS.SortedSet(sets[0]);
for (var i=1,len=sets.length;i<len;++i){
  isect = isect.intersection( new JS.SortedSet(sets[i]) );
}