2016-12-24 59 views
9

我有一个JavaScript数组:如何使用jQuery在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. 类来的4倍,在键0,2,3和7

  2. 我想使类的一个单独的数组只是,那就是,

    new_array = ["class:1", "class:2", "class:3", "class:10"]; 
    
  3. 目前,有四种班j_array。我怎样才能得到Nth class value

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

+5

这里不需要jQuery,使用本地数组方法 –

+1

为什么你需要嵌套循环? – Zain

+0

1。不要使用嵌套循环 2.做反向例如'item.indexOf(searchTerm);' – Zain

回答

8

使用Array.prototype.filter以过滤掉包含字符串类的数组中的元素 - 见下面的演示:

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

谢谢你的朋友。但我有3个问题。你能否回答这个单独的3个问题。 – Kamal

+0

问题(1)和(2)可以从上面演示中的'result'中清楚的了解...对于(3)你可以做'result [N]'... – kukkuz

+2

没有朋友。实际上,你给出问题2的答案,并且结果[N]基于新数组。但我想基于J_array的结果[N]。我找不到第一个问题的答案。 (1)的 – Kamal

13

您可以过滤元件,其匹配在一个新的数组,就回到了此新阵列的长度

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);

3

以下是对您的问题1 + 2的回答。它也是'n'证明,因此也回答您的第3部分。这通过老式的硬移植而不是时髦的功能。原始数组条目被分割和过滤,如果符合条件,我们使用指针数组(结果)存储在关联数组(结果)中,以便更容易地给出排序结果并从关联数组中提取值。最大变量可能不是必须的,但为了清晰起见,可以使用list.length。请注意,list []数组将是稀疏的(缺少步骤),所以我们在输出步骤中使用之前测试每个条目。

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

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

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

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

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

结果是:

1级发生在0,8 第3类发生在3 第5类发生在2 新数组=类别:1,等级:3 ,Class:5

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);

3

单减少就足够了这里。

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来支持还是不执行新的阵列功能的一些真的老了浏览器,你不想因为你已经到填充工具的使用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) }) 

这是相同的代码this answer,但使用jQuery。