2016-12-24 69 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。

相關問題