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

Posted

技术标签:

【中文标题】如何使用 jQuery 在 JavaScript 数组中搜索字符串? [复制]【英文标题】:How do I search a string in JavaScript array using jQuery? [duplicate] 【发布时间】:2017-05-09 21:10:57 【问题描述】:

我有一个 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"

【问题讨论】:

这里不需要jQuery,使用原生数组方法 为什么需要嵌套循环? 1 。不要使用嵌套循环 2. 做反向例如item.indexOf(searchTerm); 这个问题肯定太宽泛了——有很多可能的方法。 【参考方案1】:

如果您使用 jQuery 来支持一些仍然没有实现新的 Array 函数的非常旧的浏览器,并且您不想因为已经在使用 jQuery 而对它们进行 polyfill,那么您可以使用 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。

【讨论】:

【参考方案2】:

您可以使用filtermap 函数过滤您的数组,使其仅包含与文本'class' 匹配的元素,并使用数组索引表示法访问数组中的第n 个元素。查看下面的代码sn-p,希望对你有帮助。

以下代码 sn-p 使用 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】:

这里单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);

【讨论】:

【参考方案4】:

你必须先做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);

【讨论】:

【参考方案5】:

这是您问题 1 + 2 的答案。它也是“n”证明,因此也回答您的第 3 部分。这是通过老式的硬移植而不是时髦的功能来实现的。原始数组条目被拆分和过滤,然后如果符合条件,我们使用指针数组(列表)将其存储在关联数组(结果)中,以便更轻松地给出排序结果并从关联数组中提取值。 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()  )

结果是:

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

【讨论】:

【参考方案6】:

使用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-wrappertop:0;max-height:100%!important;

【讨论】:

谢谢朋友。但我有 3 个问题。您能否回答这个单独的 3 个问题。 问题 (1) 和 (2) 可以从上面演示中的 result 中清楚地看出...对于 (3) 你可以做 result[N]... 没有朋友。实际上你给出了问题 2 的答案,并且 result[N] 是基于 new array 。但我想要基于 J_array 的结果 [N]。我找不到第一个问题的答案。 对于(1),你需要一个像[0,2,3,7]这样的数组吗? 是的。请在您的答案中更新此内容。【参考方案7】:

您可以过滤在新数组中匹配的元素,然后只返回这个新数组的长度

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

【讨论】:

以上是关于如何使用 jQuery 在 JavaScript 数组中搜索字符串? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Javascript/JQuery 在移动浏览器中限制点运算符('.')

如何在javascript或jquery中使用变量作为数组键[重复]

如何使用 javascript/jquery 在时间字符串中添加一秒

如何使用 javascript/jquery 设置用户输入的样式

如何使用 Javascript/jQuery 使用新对象制作其他表单?

如何在 jQuery / javascript 中使用 each() 进行迭代或循环