Как выполнить поиск строки в массиве 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", так далее.

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