如何使用jQuery在JavaScript数组中搜索字符串?

12

我有一个JavaScript数组:

var j_array = new Array();
j_arry=["class:1","division:a","class:5","class:3","division:b","division:c","division:d","class:10"];

我需要找出一个类出现的次数以及其数组键,因此我使用:

found = $.inArray('class', j_array); ` But it returns `-1`;

然后我使用:

var search = 'class';
$.each([j_array], function(index, value){
    $.each(value, function(key, cell){
        if (search.indexOf(cell) !== -1)
            console.log('found in array '+index, cell);
    });
});

但这也是错误的。我该如何解决这个问题?

我想从这个数组中得到以下内容:

  1. Class coming 4 times, at key 0, 2, 3, and 7

  2. I want to make a separate array of class only, that is,

    new_array = ["class:1", "class:2", "class:3", "class:10"];
    
  3. Currently there are four classes in j_array. How can I get the Nth class value

也就是说,1st class value ="class:1"2nd class value="class:5"等等。


5
这里不需要使用jQuery,应使用本地数组方法。 - Paul S.
1
为什么需要嵌套循环? - DivineCoder
  1. 不要使用嵌套循环。
  2. 进行反向操作,例如 item.indexOf(searchTerm);
- DivineCoder
这个问题肯定太宽泛了 - 有很多可能的解决方法。 - Michał Perłakowski
7个回答

13

You could filter elements which match in a new array and just return the length of this new array

var j_arry = ["class:1","division:a","class:5","class:3","division:b","division:c","division:d","class:10"];
var res = j_arry.filter(x => x.includes("class"));
var key = res.map(x => x.split(":")[1]);
console.log("Class coming " + res.length + " , at key " + key.join(","));
console.log("new array = ", res);


8
使用 Array.prototype.filter 过滤包含字符串 class 的数组元素 - 请参见以下演示:

var j_array =["class:1","division:a","class:5","class:3","division:b","division:c","division:d","class:10"];

var result = j_array.filter(function(e){
  return e.indexOf('class')!==-1;
});

console.log(result);

编辑:

如果你想得到索引列表,你可以尝试这个:

var j_array =["class:1","division:a","class:5","class:3","division:b","division:c","division:d","class:10"];

var filteredIndices = []

var filtered = j_array.filter(function(e,i){
  if(e.indexOf('class')!==-1) {
    filteredIndices.push(i);
    return true;
  } else {
    return false;
  }
});

console.log(filtered);
console.log(filteredIndices);

// Nth class value
console.log(filtered[2]); // this prints the 3rd one
.as-console-wrapper{top:0;max-height:100%!important;}


1
谢谢朋友。但我有三个问题。你能分别回答这三个问题吗? - Kamal
问题(1)和(2)可以从上面的演示中的result清楚地看出...对于(3),您可以通过result[N]来完成... - kukkuz
2
没有朋友。实际上,你回答了第二个问题,并且result[N]是基于新数组的。但我想要result[N]基于J_array。而且我找不到第一个问题的答案。 - Kamal
对于(1),你需要一个类似 [0,2,3,7] 的数组吗? - kukkuz
是的。请在您的回答中更新此内容。 - Kamal
@Kamal,请查看更新后的答案,谢谢! - kukkuz

3

以下是对你的问题1 + 2的答案,这也证明了第3部分的答案。这是通过老式的辛勤工作而不是花哨的函数来实现的。原始数组条目被拆分并过滤,然后如果符合条件,我们将其存储在关联数组(results)中,使用指针数组(list)使得更容易给出排序结果并从关联数组中提取值。max变量可能不必要,但包含在内是为了清晰起见-可以使用list.length代替。请注意,list []数组将是稀疏的(缺少步骤),因此我们在输出步骤之前测试每个条目。

  var j_array = new Array();
  j_arry=["class:1","division:a","class:5","class:3","division:b","division:c","division:d","class:10","class:1"];

  var a, result = [], list=[], max = -1    
  for (var i =0; i < j_arry.length; i = i + 1) {

   var a = j_arry[i].split(":")
    if ( a[0] === "class") {
    
    var key = "c" + a[1]
     if ( !result[key] ) { result[key] = {pos:[]}}
    result[key].cnt = result[key].cnt ? result[key].cnt + 1 : 1; 
     result[key].pos.push(i)
     list[parseInt(a[1])] = "c" + a[1]  
     
     max = parseInt(a[1]) > max ? a[1] : max;
    }
  }

  // say locations
  for (var i = 0; i < max; i = i + 1) {
   if (list[i]) {
   key = "c" + i 
    console.log("Class " + i + " occurs  at " + result[key].pos.toString()  )
    }
  }

  // make new array
  var newArray=[]
  for (var i = 0; i < max; i = i + 1) {
   if (list[i]) {
    newArray.push("Class:" + i)
    }
  }
  console.log("New array=" + newArray.toString()  )

结果如下:

Class 1 发生在0,8 Class 3 发生在3 Class 5 发生在2 新数组=Class:1,Class:3,Class:5


3
这里只需要一个单一的reduce就足够了。

var arr = ["class:1","division:a","class:5","class:3","division:b","division:c","division:d","class:10"],
    res = arr.reduce((p,c) => c.includes("class") ? (p.count++, p.keys.push(c.split(":")[1]), p)
                                                  : p ,{count:0, keys:[]});
console.log(res);


3
你可以使用filtermap函数来过滤数组,只保留与文本'class'匹配的元素,并使用数组索引符号访问数组中的第n个元素。请查看下面的代码片段,希望能对你有所帮助。
下面的代码片段使用ES6箭头语法。

var arr = ["class:1", "division:a", "class:5", "class:3", "division:b", "division:c", "division:d", "class:10"];
var result = arr.filter(x => x.indexOf('class') !== -1);
var indices = result.map(x => arr.indexOf(x));
console.log(indices);
console.log(result);

var nValue = window.prompt('Enter n value');
console.log(result[nValue]);


3

如果您正在使用jQuery来支持一些仍然没有实现新的Array函数的旧浏览器,并且不想使用polyfill,因为您已经在使用jQuery,那么您可以使用相应的jQuery函数:

var arr = ["class:1", "division:a", "class:5", "class:3", "division:b", "division:c", "division:d", "class:10"]
var result = $.grep(arr, function (x) { return x.indexOf('class') !== -1 })
var indices = $.map(result, function (x) { return arr.indexOf(x) })

这段代码与此答案相同,但使用了jQuery。


1

你必须先执行map,然后再执行filter

var j_array = ["class:1", "division:a", "class:5", "class:3", "division:b", "division:c", "division:d", "class:10"];

var result = j_array.map(function(e, i) {
  return e.indexOf('class') > -1 ? '' + i : false;
}).filter(function(e) {
  return !!e;
});
console.log(result);


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