共被编辑 3 次

版本 更新时间 贡献者 编辑原因 操作
#r3 2017年03月26日 LeslieHoward364 更新问题 查看

JavaScript数组系列问题:数组差集

JavaScript求出两个数组的差集,下面是我实现的方法

function arrayDiffSet(a, b) {

    if ((!a || !a.length) && (b && b.length)) {
        return b
    } else if ((!b || !b.length) && (a && a.length)) {
        return a
    }

    var aMap = {},
        _aMap = {},
        _bMap = {};

    for (var i = 0, length = a.length; i < length; i++) {
        aMap[a[i]] = _aMap[a[i]] = true;
    }

    for (var i = 0, length = b.length; i < length; i++) {
        if (aMap[b[i]]) {
            delete _aMap[b[i]];
        } else {
            _bMap[b[i]] = true;
        }
    }

    return {
        a: Object.keys(_aMap),
        b: Object.keys(_bMap)
    }

}

function generateRandomArray(length, range) {
    var result = [];
    for (var i = 0; i < length; i++) {
        result[result.length] = Math.floor(Math.random() * range);
    }
    return result
}

var a = generateRandomArray(5, 10);
var b = generateRandomArray(10, 10);

console.log('a', a);
console.log('b', b);

console.time('start');
console.log(arrayDiffSet(a, b));
console.timeEnd('start');




----------但是这个方法还有下面两点:
1、扩展性差,如果我需要返回的差集不去重,那需要再重新写一个方法;
2、没有办法对对象数组求差集;

所以在这里想问问各位大神有没有更优的解决方案

#r2 2017年03月25日 LeslieHoward364 更新问题 查看

JavaScript数组系列问题:数组差集

JavaScript求出两个数组的差集,下面是我实现的方法

function arrayDiffSet(a, b) {

            if((!a || !a.length) && (b && b.length)) {
                return b
            } else if((!b || !b.length) && (a && a.length)) {
                return a
            }

            var aMap = {}, _aMap = {}, _bMap = {};

            for(var i = 0, length = a.length; i < length; i++) {
                aMap[a[i]] = _aMap[a[i]] = true;
            }

            for(var i = 0, length = b.length; i < length; i++) {
                if(aMap[b[i]]) {
                    delete _aMap[b[i]];
                } else {
                    _bMap[b[i]] = true;
                }
            }

            return {
                a: Object.keys(_aMap),
                b: Object.keys(_bMap)
            }

        }

        function generateRandomArray(length, range) {
            var result = [];
            for(var i = 0; i < length; i++) {
                result[result.length] = Math.floor(Math.random() * range);
            }
            return result
        }

        var a = generateRandomArray(5, 10);
        var b = generateRandomArray(10, 10);

        console.log('a', a);
        console.log('b', b);

        console.time('start');
        console.log(arrayDiffSet(a, b));
        console.timeEnd('start');
        
        
        


但是这个方法还有下面两点:
1、扩展性差,如果我需要返回的差集不去重,那需要再重新写一个方法;
2、没有办法对对象数组求差集;

所以在这里想问问各位大神有没有更优的解决方案

#r1 2017年03月25日 LeslieHoward364 创建问题 查看

JavaScript数组系列问题:数组差集

JavaScript求出两个数组的差集,下面是我实现的方法

function arrayDiffSet(a, b) {

        if((!a || !a.length) && (b && b.length)) {
            return b
        } else if((!b || !b.length) && (a && a.length)) {
            return a
        }

        var aMap = {}, _aMap = {}, _bMap = {};

        for(var i = 0, length = a.length; i < length; i++) {
            aMap[a[i]] = _aMap[a[i]] = true;
        }

        for(var i = 0, length = b.length; i < length; i++) {
            if(aMap[b[i]]) {
                delete _aMap[b[i]];
            } else {
                _bMap[b[i]] = true;
            }
        }

        return {
            a: Object.keys(_aMap),
            b: Object.keys(_bMap)
        }

    }

    function generateRandomArray(length, range) {
        var result = [];
        for(var i = 0; i < length; i++) {
            result[result.length] = Math.floor(Math.random() * range);
        }
        return result
    }

    var a = generateRandomArray(5, 10);
    var b = generateRandomArray(10, 10);

    console.log('a', a);
    console.log('b', b);

    console.time('start');
    console.log(arrayDiffSet(a, b));
    console.timeEnd('start');
        
        
        


但是这个方法还有下面两点:
1、扩展性差,如果我需要返回的差集不去重,那需要再重新写一个方法;
2、没有办法对对象数组求差集;

所以在这里想问问各位大神有没有更优的解决方案