假设我有2个阵列
firstArray = [1, 2, 3, 4, 5];
secondArray = [5, 4, 3, 2, 1];
我想知道它们是否包含相同的元素,而顺序并不重要。我知道我可以编写一个函数来对它们进行排序,然后循环遍历它们进行检查,但是有没有预先构建的函数呢? (不仅是Vanilla JS,其他javascript库也没关系)
答案 0 :(得分:4)
使用jQuery
您可以使用jQuery
比较两个数组:
// example arrays:
var firstArray = [ 1, 2, 3, 4, 5 ];
var secondArray = [ 5, 4, 3, 2, 1 ];
// compare arrays:
var isSameSet = function( arr1, arr2 ) {
return $( arr1 ).not( arr2 ).length === 0 && $( arr2 ).not( arr1 ).length === 0;
}
// get comparison result as boolean:
var result = isSameSet( firstArray, secondArray );
请参阅此问题helpful answer
答案 1 :(得分:1)
在JavaScript中有一个Array.sort()
方法,并且为了比较(排序)数组,我认为最好查看this question,因为它有一个非常好的答案。
特别注意,将数组作为字符串进行比较(例如,通过JSON.stringify
)是一个非常糟糕的主意,因为像"2,3"
这样的值可能会破坏这样的检查。
答案 2 :(得分:0)
这是使用Vanilla JS的工作实现:
function haveMatchingElements(firstArray, secondArray) {
var stringsInFirstArray = parse(firstArray, 'string'),
stringsInSecondArray = parse(secondArray, 'string'),
numbersInFirstArray = parse(firstArray, 'number'),
numbersInSecondArray = parse(secondArray, 'number'),
stringResults = compare(stringsInFirstArray, stringsInSecondArray),
numberResults = compare(numbersInFirstArray, numbersInSecondArray);
if (stringResults && numberResults) {
return true;
} return false;
function parse(array, type) {
var arr = [];
arr = array.sort().filter(function(index) {
if (typeof index == type)
return index;
});
return arr;
}
function compare(firstArray, secondArray) {
if (firstArray.length !== secondArray.length)
return false;
for (var i = firstArray.length; i--;) {
if (firstArray[i] !== secondArray[i])
return false;
}
return true;
}
}
将字符串解析为不同的数组并分别检查它们。由于1
函数导致的隐式类型转换,这将更正"1"
和true
匹配为sort
的问题。
实施很简单:
var arr1 = ['1', 1];
var arr2 = [1, '1'];
var results = haveMatchingElements(arr1, arr2);
console.log(results); // true
答案 3 :(得分:0)
使用原生 JavaScript
支持您可以使用的所有现代浏览器Array.prototype.every()
ECMAScript 2016
let firstArray = [1, 2, 3, 4, 5];
let secondArray = [5, 4, 3, 2, 1];
let Equals = firstArray.every((item)=>secondArray.includes(item))
alert("Equals? " + Equals)
Internet Explorer 支持
Internet Explorer 无权访问 Array.prototype.includes()。如果您需要它在 Internet Explorer 中运行,您可以使用 indexOf
let firstArray = [1, 2, 3, 4, 5];
let secondArray = [5, 4, 3, 2, 1];
let Equals = firstArray.every(function (item){return secondArray.indexOf(item) > -1})
alert("Equals? " + Equals)
这将遍历 firstArray 中的每一项并检查该值是否包含在 secondArray 中,并且仅当函数为 Every item 返回 true 时才返回 true
请注意,给定的函数适用于这个问题,但它是非递归的,仅适用于两个平面数组上的原始类型,如果要比较非原始类型,则需要将比较函数修改为比较你的对象结构
答案 4 :(得分:-1)
不是在Vanila Javascript中,但在Angular中,可以选择匹配两个对象。
angular.equals([1,2,3],[1,2,3])
确定两个对象或两个值是否相等。支持值类型,正则表达式,数组和对象。
看看这对你有帮助。
alert("Match result of [1,2,3] & [1,2,3] is "+angular.equals([1,2,3],[1,2,3]));
alert("Match result of [1,4,3] & [1,2,3] is "+angular.equals([1,4,3],[1,2,3]));
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
单击“运行代码”片段。如果这解决了您的需要,请将其标记为答案:)
如果顺序不重要且数组是数字类型。
var a1 = [1, 2, 3];
var a2 = [2, 1, 3];
//In case order is not important and array is of number type.
alert(eval(JSON.stringify(a1).replace(/,/g, "+").replace(/\[/g, "").replace(/\]/g, "")) === eval(JSON.stringify(a2).replace(/,/g, "+").replace(/\[/g, "").replace(/\]/g, "")));