如何在Javascript中比较字符串数组?
我想看看两个字符串数组是否相等 例如:如何在Javascript中比较字符串数组?,javascript,arrays,compare,string-comparison,Javascript,Arrays,Compare,String Comparison,我想看看两个字符串数组是否相等 例如: 比较([“abc”,“def”],[“def”,“abc”]) 应返回true,类似地 compare(["abc", "def"], ["def", "ghi"]) 应返回false 最好的方法是什么?JavaScript没有一个集合或多集合的数据结构(至少没有一个具有广泛的浏览器支持),这是您通常用来测试两组项目是否相同(无论顺序如何)。因此,我建议对数组进行排序并检查它们的内容是否相等。如果您知道数组仅包含字符串,则可以使用简单的等式检查项目:
比较([“abc”,“def”],[“def”,“abc”])
应返回true
,类似地
compare(["abc", "def"], ["def", "ghi"])
应返回false
最好的方法是什么?JavaScript没有一个集合或多集合的数据结构(至少没有一个具有广泛的浏览器支持),这是您通常用来测试两组项目是否相同(无论顺序如何)。因此,我建议对数组进行排序并检查它们的内容是否相等。如果您知道数组仅包含字符串,则可以使用简单的等式检查项目:
function compare(array1, array2) {
if (array1.length != array2.length) {
return false;
}
array1 = array1.slice();
array1.sort();
array2 = array2.slice();
array2.sort();
for (var i = 0; i < array1.length; i++) {
if (array1[i] != array2[i]) {
return false;
}
}
return true;
}
console.log(compare(["abc", "def"], ["def", "abc"])); // true
console.log(compare(["abc", "def"], ["def", "ghi"])); // false
函数比较(array1,array2){
if(array1.length!=array2.length){
返回false;
}
array1=array1.slice();
array1.sort();
array2=array2.slice();
array2.sort();
对于(变量i=0;i
对于更一般的情况,您需要一个更复杂的等式定义,我建议您浏览以下内容的答案。Naive algorithm:O(N^2)
函数比较(array1,array2){
对于(变量i=0;i
更好的一个:(使用排序,O(NLOGN))
函数比较(array1,array2){
array1.sort();
array2.sort();
对于(变量i=0;i
统一解决方案:
function compare(a, b){
var isEqual = false;
if (Array.isArray(a) && Array.isArray(b) && a.length == b.length){
a.sort();
b.sort();
var i;
for (i = 0; i < arr1.length; i++){
if (a[i] === b[i]){
isEqual = true;
} else{
isEqual = false;
break;
}
}
}
return isEqual;
}
var arr1 = ["def", "abc"], arr2 = ["abc", "def"];
console.log(compare(arr2,arr1)); // gives 'true'
console.log(compare(["abc", "def"], ["def", "ghi"])); // gives 'false'
功能比较(a、b){
var isEqual=假;
if(Array.isArray(a)&&Array.isArray(b)&&a.length==b.length){
a、 排序();
b、 排序();
var i;
对于(i=0;i
功能比较(arr1、arr2){
var匹配=真
如果(arr1.length!=arr2.length){
匹配=错误
}
arr1=arr1.slice();
arr1.sort();
arr2.slice();
arr2.sort();
对于(变量i=0;i
我建议遵循ES6 oneliner
const compare = (a1, a2) =>
(a1 = new Set(a1)) &&
(a2 = new Set(a2)) &&
a1.size === a2.size &&
[...a1].every(v => a2.has(v));
比较(['a','a'],['a','b'])
应返回false
)compare(['a','b'],['a','b','c'])
应返回false
)请提供您尝试执行此操作的代码对数组进行排序并将a[n]与b[n]进行比较,或者跳过排序并在b的每个位置查找a[n]。如果(array1[I]!=array2[I]){return false;}中的逻辑可能重复,我认为您有问题。你不知道;如果找不到匹配项,您不想中断,您应该继续查找匹配项。看起来,如果它们包含相同的项,即使顺序不同,也必须将它们视为相等。这不能通过你的检查。将是一个n^2迭代。。。或者在实现时需要排序。谢谢您的回答。这是最有效的方法吗?JS没有任何内置函数用于此操作吗?我想我已经回答了您的评论。我最初误解了这个问题,并期望数组完全相等。现在我使用与Culme相同的方法对数组进行排序。Abhijith:我通常使用这种方法。在极端情况下,我会将
array1
中的所有项作为键放在一个对象中(JavaScript最接近于一个设置的数据结构),以在迭代array2
时获得固定时间的查找,但我几乎不需要这样做。这对于a1=['foo','foo']
和a2=['foo','bar']都会返回true代码>@StephenHarris谢谢!我应用了Set
转换来解决重复的情况。这两种方法都需要if(array1.length!==array2.length){return false}
才能在一开始工作。对于原语来说非常酷,但要注意许多陷阱
function compare(a, b){
var isEqual = false;
if (Array.isArray(a) && Array.isArray(b) && a.length == b.length){
a.sort();
b.sort();
var i;
for (i = 0; i < arr1.length; i++){
if (a[i] === b[i]){
isEqual = true;
} else{
isEqual = false;
break;
}
}
}
return isEqual;
}
var arr1 = ["def", "abc"], arr2 = ["abc", "def"];
console.log(compare(arr2,arr1)); // gives 'true'
console.log(compare(["abc", "def"], ["def", "ghi"])); // gives 'false'
function compare(arr1, arr2){
var match = true
if(arr1.length != arr2.length){
match = false
}
arr1 = arr1.slice();
arr1.sort();
arr2.slice();
arr2.sort();
for(var i = 0; i < arr1.length; i++){
if(arr1[i] != arr2[i]){
match = false;
}
}
return match;
}
console.log(compare(["abc", "def"], ["def", "abc"])); // it will return true
console.log(compare(["abc", "def"], ["def", "ghi"])); // it will return false
const compare = (a1, a2) =>
(a1 = new Set(a1)) &&
(a2 = new Set(a2)) &&
a1.size === a2.size &&
[...a1].every(v => a2.has(v));
JSON.stringify(array1.sort()) === JSON.stringify(array2.sort())