JavaScript中的indexOf适用于多个值吗?

6
我有一个多维 JavaScript 数组,像这样。
[
["9", "16", "19", "24", "29", "38"],
["9", "15", "19", "24", "29", "38"],
["10", "16", "19", "24", "29", "38"],
["9", "16", "17", "19", "24", "29", "39"],
["10", "16", "17", "19", "24", "29", "39"],
["9", "15", "21", "24", "29", "38"]

.......
.......
]

大约有40个,确切地说。
我还有另一个数组叫做check,它包含以下值。
 [9,10] //This is of size two for example,it may contain any number of elements BUT it only contains elements(digits) from the multidimensional array above

我想要的是,我需要基于检查数组元素使多维数组唯一。
例如,如果检查数组是`[15]`,则多维数组将为:
[
    ["9", "15", "19", "24", "29", "38"],
   //All the results which contain 15

]

如果检查的数组是[15,21],那么多维数组将会是:
[
    ["9", "15", "21", "24", "29", "38"]
    //simply containing 15 AND 21.Please note previous example has only 15 in it not 21
    //I need an AND not an OR

]

我尝试了JavaScript的IndexOf方法,但它给我一个"OR"的结果,而不是"AND"。
提前感谢。

3
大约40岁左右。- 啊,讽刺。 - nnnnnn
1
是的,您想要过滤原始数组以返回包含检查数组中所有元素的所有子数组。除了您的第二个示例返回一个在原始数组中未显示的子数组,所以也许我没有理解。 (我的先前评论只是嘲笑您在那里选择的词语。) - nnnnnn
1
@nnnnnn:那可能是他大约40个中的一个 :) - Amberlamps
@nnnnnn问题已编辑,请查看。 - coolguy
应该按照原文的顺序进行翻译。 - Diode
显示剩余4条评论
4个回答

5

您可以使用 .filter() 方法

var mainArray = [ /* your array here */ ],
    check = ["15", "21"],
    result;

result = mainArray.filter(function(val) {
    for (var i = 0; i < check.length; i++)
        if (val.indexOf(check[i]) === -1)
            return false;    
    return true;
});

console.log(result);

演示: http://jsfiddle.net/nnnnnn/Dq6YR/

请注意,.filter() 在 IE 版本 9 之前不受支持,但是您可以解决这个问题


4
使用.filter.every,您可以过滤每个参数在行中都明显的行:
var filter = function(args) {
  return arr.filter(function(row) {
    return args.every(function(arg) {
      return ~row.indexOf(String(arg));  // [15] should search for ["15"]
    });
  });
};

.every 在这里实际上执行的是“AND”操作。如果需要“OR”,可以使用.some。这些数组函数在新版浏览器中都可用。


那个波浪号(~)是什么意思啊?:/ ~row - the_marcelo_r

2

还有一种解决方案不使用 filter()every()

// function

function AndArray(start, check) {

    this.stripArray = function(element, array) {
        var _array = [];
        for(var i = 0; i < array.length; i++)
            for(var j = 0; j < array[i].length; j++)
                if(element == array[i][j]) _array.push(array[i]);
        return _array;
        }

    for(var k = 0; k < start.length; k++)
        if(start.length > 0) start = this.stripArray(check[k], start);

    return start;

    }

// use

var check = [15, 21];

var start= [[ 15, 6 , 8], [3, 21, 56], [15, 3, 21]];

console.log(AndArray(start, check));    

0
这应该可以解决它。

var checkURL = function (url) {
  var final = false;
  if (url.indexOf('jpg') > -1) {
    final = true
  }

  if (url.indexOf('jpeg') > -1) {
    final = true
  }

  if (url.indexOf('gif') > -1) {
    final = true
  }

  if (url.indexOf('png') > -1) {
    final = true
  }

  return final
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接