es6如何优雅的判断两个数组包含的值完全相同,顺序无所谓

这是我现在的做法,请问还有更好一些的方式么

let flag = true
    const listA = [1, 2, 3]
    const listB = [2, 3, 4]
    if (listA.length !== listB.length) {
      flag = false
    } else {
      listA.forEach(item => {
        if (listB.indexOf(item) === -1) {
          flag = false
        }
      })
    }
阅读 26.5k
9 个回答

一句就能搞定:

const listA = [1, 2, 3]
const listB = [2, 3, 1]

const result = listA.length === listB.length && listA.every(a => listB.some(b => a === b)) && listB.every(_b => listA.some(_a => _a === _b));

console.log(result);
//true

如果有重复 你这判断 是错误的

const listA = [1, 2, 2]
const listB = [1, 1, 2]

如果只是基本 类型 建议 sort 之后 意义对比
如果是 复杂类型 还要递归 对比

const listA = [1, 2, 3]
const listB = [3, 2, 1]
Array.prototype.equals = function(arr)
{
    return this.sort().join() === arr.sort().join()
}
console.log(listA.equals(listB))

方法1:先两个数组用同样的方式排序,再字符串化比较
方法2:把两个数组分别放到Set里面去,再把其中一个Set add到另外一个Set,如果长度没变两数组元素相同

你可以首先排序,然后遍历一遍,这样时间复杂度主要就是排序的时间复杂度了;

但是我觉得这段代码还有可以优化的地方:

function isSame (a, b) {
  if (a.length !== b.length) return false

  let c = b.slice()
  // 在可以提前退出的情况下不要使用forEach
  for (let i = 0, len = a.length; i < len; i++) {
    let j = c.indexOf(a[i])
    if ( j === -1) return false
    c.splice(j, 1) // 删除已经匹配的元素,可以缩短下次匹配的时间
  }
  return true
}
isSame([1, 2, 2], [1, 1, 2]) // false
isSame([1, 2, 2], [2, 1, 2]) // true

你这个写法我也没看懂, 测试了一下
[1,2,3]和[1,2,3]返回false,
[1,2,3]和[2,3,4]也返回false

如果数组元素是纯字符的话,可以试试以下:

function isEqual(arr1, arr2) {
  return JSON.stringify(arr1.sort()) === JSON.stringify((arr2.sort()))
}

// true
isEqual([1, 5, 'string', 2], [1, 2, 5, 'string'])

如果是纯字符,可以先排序然后转化成字符串直接比较 使用sort 和 join 这两个函数就搞得定吧

一种其他的思路

测试一下

/**
 * 对比数组元素是否相同
 * @arr1            {array}     待判断数组 1
 * @arr2            {array}     待判断数组 2
 * */
const checkArrSame = (arr1, arr2) => {
    // 数组合并
    const sumArr = [...arr1, ...arr2];
    // 数组去重
    const newArr = [...new Set(sumArr)];
    // 根据数组长度对比返回结果
    return [...new Set(arr1)].length === newArr.length;
};

写成一句

const checkArrSames = (arr1, arr2) => [...new Set(arr1)].length === [...new Set([...arr1, ...arr2])].length;
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏