当前位置: 首页 > 知识库问答 >
问题:

获取比较Javascript中两个或多个数组的Common和Uniques元素

卫高明
2023-03-14

首先我查了很多帖子,像这样:

而且可能永远不会是数组中的重复值。用普通的JS会很棒

而且我不关心IE(但我想对其他人来说会很好),所以如果有一个新的ES6方式,我会喜欢它,我更关心性能:)

// Some values that gonna be inside the array1 & array2
function random(){};
var a = 5,
    b = {};


// The Arrays
var array1 = [0,1,2,3, "HeLLo", "hello", 55.32, 55.550, {key: "value", keyWithArray: [1,2,3]}, random, a, b];
var array2 = [2,3, "hello", "Hello", 55.32, 55.551, {key: "value", keyWithArray: [1,2,3]}, b];



// The Unique Array should be all the elements that array1 have and array2 haven't
var uniqueArray = [0, 1, "HeLLo", 55.550, random, a];


// The commonArray should the common elements in both arrays (array1 and array2)
var commonArray = [2,3, "hello", 55.32, {key: "value", keyWithArray: [1,2,3]}, b]




// I try something like this but doesn't work
var uniqueArray = array1.filter(function(val) { return array2.indexOf(val) == -1; });
console.log(uniqueArray);

共有1个答案

戚晨
2023-03-14

根据我的理解,您基本上希望对两个数组执行一些set操作。我的建议是首先从两个数组中构建一个更合适的数据结构,因为要想获得这两个数组的交点,必须使用O(N²)算法。类似这样的事情应该可以做到:

// convert a plain array that has values of mixed types to and object
// where the keys are the values in plain form in case of strings, scalars or functions, or serialized objects in
// case of objects and arrays, and where the values are the unaltered values of the array.
var _toObject = function(arr) {
    var obj = {};
    for (var i=0 ; i<arr.length ; i++) {
        var el = arr[i];
        var type = typeof el;
        if (type !== 'object') { // scalars, strings and functions can be used as keys to an array
            obj[el] = el;
        }
        else { // objects and arrays have to be serialized in order to be used as keys
            obj[JSON.stringify(el)] = el;
        }
    };
    return obj;
};


var objArray1 = _toObject(array1);
var objArray2 = _toObject(array2);

var uniqueArray = [];
var commonArray = [];
for (var i in objArray1) {
    if (i in objArray2) {
        commonArray.push(objArray1[i]); // push the common elements

        delete objArray2[i]; // delete so in the end objArray2 will only have unique elements
    }
    else {
        uniqueArray.push(objArray1[i]); // push unique element from objArray1
    }
}

for (var i in objArray2) { // now objArray2 has only unique values, just append then to uniqueArray
    uniqueArray.push(objArray2[i])
}

console.log('Unique array', uniqueArray);
console.log('Common array', commonArray);

这应该会给出您想要的结果:

bash-4.2$ node test.js 
Unique array [ 0, 1, 5, 'HeLLo', 55.55, [Function: random], 'Hello', 55.551 ]
Common array [ 2, 3, 'hello', 55.32, { key: 'value', keyWithArray: [1, 2, 3 ] }, {}]
 类似资料:
  • 我有一个简单的javascript问题,我真的需要一些帮助!我正在尝试弄清楚如何在数组之间比较元素,以及在下一个循环中再次比较较大的元素。假设我们有数组A和数组B。 我的问题是,在比较索引处的元素之后,我希望在下一个循环周期中比较较大的元素。 如果A=[5,7,4],B=[2,8,5] 在第一个循环中,5与2进行比较,2较小,因此会发生一些事情。在下一个循环周期中,我希望5与8进行比较,而对于现在

  • 问题内容: 有人遇到过这个问题吗?假设您有两个类似以下的数组 有没有一种方法可以比较b中a中的哪些元素?例如, 我正在尝试避免循环,因为要花费数百万个元素才能解决问题。有任何想法吗? 干杯 问题答案: 实际上,有一个比以下任何一种方法更简单的解决方案: 所得的c为:

  • 问题内容: 我有这个间隔,当前每5秒执行一次ajax请求。我对声明有疑问。我的代码总是输入它,并且两个json值完全相同,为什么它认为它们不同? 编辑 这是控制台输出(虚线是分隔请求,它不在实际输出中) 问题答案: 不能保证以相同的方式序列化JSON对象,也不能保证属性以相同的顺序进行序列化,使用并不是测试对象相等性的好方法。 一个更好的例子是这样的函数(前一段时间在互联网上找到,希望我能感谢原始

  • 问题内容: 我正在尝试编写代码以比较两个数组。在第一个数组中,我输入了自己的数字,但是在第二个数组中,输入了输入文件中的数字。该数组的大小由文件中的第一个数字确定,而第一个数组的大小始终为10。两个数组以及数字的长度必须相同。 我的代码如下: 问题答案:

  • 我得到了两个字符串类型arraylist。一个列表包含“book1”、“book2”、“book3”和“book4”。另一个arrayList包含“book1”、“book2”、“book3”。因此,第一个列表的大小为4,第二个列表的大小为3。我创建了另一个与第一个列表大小相等的arrayList 但是当我这样做的时候,我不能设置1,因为我不能进入if状态,有人能帮我吗