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

        }

      })

    }


慕慕森
浏览 5814回答 7
7回答

眼眸繁星

一句就能搞定: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, 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,如果长度没变两数组元素相同

Qyouu

你可以首先排序,然后遍历一遍,这样时间复杂度主要就是排序的时间复杂度了;但是我觉得这段代码还有可以优化的地方:function isSame (a, b) {&nbsp; if (a.length !== b.length) return false&nbsp; let c = b.slice()&nbsp; // 在可以提前退出的情况下不要使用forEach&nbsp; for (let i = 0, len = a.length; i < len; i++) {&nbsp; &nbsp; let j = c.indexOf(a[i])&nbsp; &nbsp; if ( j === -1) return false&nbsp; &nbsp; c.splice(j, 1) // 删除已经匹配的元素,可以缩短下次匹配的时间&nbsp; }&nbsp; return true}isSame([1, 2, 2], [1, 1, 2]) // falseisSame([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) {&nbsp; return JSON.stringify(arr1.sort()) === JSON.stringify((arr2.sort()))}// trueisEqual([1, 5, 'string', 2], [1, 2, 5, 'string'])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript