为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕慕森 2019-03-22 18:19:27
这是我现在的做法,请问还有更好一些的方式么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        }      })    }
查看完整描述

7 回答

?
眼眸繁星

TA贡献1873条经验 获得超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


查看完整回答
1 反对 回复 2019-04-01
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

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


查看完整回答
反对 回复 2019-04-01
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

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

查看完整回答
反对 回复 2019-04-01
?
Qyouu

TA贡献1786条经验 获得超11个赞

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


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


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


查看完整回答
反对 回复 2019-04-01
?
狐的传说

TA贡献1804条经验 获得超3个赞

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

查看完整回答
反对 回复 2019-04-01
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

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


function isEqual(arr1, arr2) {

  return JSON.stringify(arr1.sort()) === JSON.stringify((arr2.sort()))

}


// true

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


查看完整回答
反对 回复 2019-04-01
  • 7 回答
  • 0 关注
  • 5813 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信