Как выполнить поиск строки в массиве 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);
});
});
но это тоже неправильно. Как мне решить эту проблему?
из этого массива я хочу сделать следующее:
класс приходит 4 раза, в ключе 0, 2, 3 и 7
-
Я хочу сделать отдельный массив только класса, то есть
new_array = ["class:1", "class:2", "class:3", "class:10"];
в настоящее время есть четыре класса в
j_array
. Как я могу получитьNth class value
то есть 1st class value ="class:1"
, 2nd class value="class:5"
, так далее.
7 ответов
использовать 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;}
вы можете фильтровать элементы, которые соответствуют новому массиву, и просто возвращать длину этого нового массива
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);
вот ответ на ваши вопросы 1 + 2. Это также доказательство "n", поэтому также отвечает на вашу часть 3. Это работает старомодным жестким трансплантатом, а не фанк-функциями. Исходные записи массива разделяются и фильтруются, затем, если квалификация сохраняется в ассоциативном массиве (результатах), используя массив указателей (список), чтобы облегчить получение отсортированного результата и вытащить значения из ассоциативного массива. Переменная max, вероятно, не нужна, но включена для ясности - могла бы использоваться список.вместо этого длина. Обратите внимание, что массив 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() )
результаты:
класс 1 происходит при 0,8 Класс 3 происходит в 3 Класс 5 происходит в 2 Новый массив=класс:1,класс:3,класс: 5
Single 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);
можно использовать filter
и map
функции для фильтрации массива, чтобы иметь только элементы, соответствующие тексту '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]);
Если вы используете 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) })
это тот же код, что и ответ, но с использованием jQuery.
вам нужно 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);