【问题标题】:Merging of two arrays, store unique elements, and sorting in jQuery合并两个数组,存储唯一元素,并在 jQuery 中排序
【发布时间】:2014-04-08 04:08:54
【问题描述】:
var Arr1 = [1,3,4,5,6];

var Arr2 = [4,5,6,8,9,10];

我正在尝试合并这两个数组,输出是[1,3,4,5,6,4,5,6]

我已经使用$.merge(Arr1, Arr2);这块来合并它们。使用 alert 我可以看到上面的合并数组。

现在我的问题是如何获得以下输出: [1,3,4,5,6,8,9,10]

即元素应该是唯一的,并且按照我提到的相同方式排序。

请帮忙。

【问题讨论】:

    标签: javascript jquery arrays merge


    【解决方案1】:

    您可以使用Array.prototype.sort() 进行真正的数字排序,并使用Array.prototype.filter() 仅返回唯一元素。

    你可以把它包装成一个类似这样的助手:

    var concatArraysUniqueWithSort = function (thisArray, otherArray) {
        var newArray = thisArray.concat(otherArray).sort(function (a, b) {
            return a > b ? 1 : a < b ? -1 : 0;
        });
    
        return newArray.filter(function (item, index) {
            return newArray.indexOf(item) === index;
        });
    };
    

    请注意,自定义排序功能仅适用于数字元素,因此如果您想将其用于字符串或将字符串与数字混合使用,您必须将其更新为考虑到这些情况,尽管其余的不应该有太大变化.

    像这样使用它:

    var arr1 = [1, 3, 4, 5, 6];
    var arr2 = [4, 5, 6, 8, 9, 10];
    
    var arrAll = concatArraysUniqueWithSort(arr1, arr2);
    

    arrAll 现在将是 [1, 3, 4, 5, 6, 8, 9, 10]


    DEMO - 连接 2 个数组,排序和删除重复项


    我敢肯定,有很多方法可以做到这一点。这是我能想到的最简洁的。

    【讨论】:

      【解决方案2】:

      合并两个或多个数组 + 删除重复项 + sort()

      jQuery.unique([].concat.apply([],[[1,2,3,4],[1,2,3,4,5,6],[3,4,5,6,7,8]])).sort();
      

      【讨论】:

        【解决方案3】:

        仅使用 javascript 的单行解决方案。

        var Arr1 = [1,3,4,5,6];
        
        var Arr2 = [4,5,6,8,9,10];
        
        const sortedUnion = [... new Set([...Arr1,... Arr2].sort((a,b)=> a-b))]
        console.log(sortedUnion)

        【讨论】:

        • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
        【解决方案4】:

        这看起来像是 Array.prototype.indexOf 的工作

        var arr3 = arr1.slice(),              // clone arr1 so no side-effects
            i;                                // var i so it 's not global
        for (i = 0; i < arr2.length; ++i)     // loop over arr2
            if (arr1.indexOf(arr2[i]) === -1) // see if item from arr2 is in arr1 or not
                arr3.push(arr2[i]);           // it's not, add it to arr3
        arr3.sort(function (a, b) {return a - b;});
        arr3; // [1, 3, 4, 5, 6, 8, 9, 10]
        

        【讨论】:

        • 你能解释一下吗?前 2 行我不明白...等待
        • @Monibrata 添加了 cmets
        • 感谢您的解释...但是使用此代码,我的输出类似于 [1,3,4,4,5,5,6,6,8,9,10]
        【解决方案5】:
        a = [1, 2, 3]
        b = [2, 3, 4]
        $.unique($.merge(a, b)).sort(function(a,b){return a-b}); -> [1, 2, 3, 4]
        

        更新: 这是一个坏主意,因为 'unique' 函数不适用于数字或字符串。 但是,如果必须,则需要告诉 sort 函数使用新的比较器,因为默认情况下它按字典顺序排序。

        【讨论】:

        • 使用它显示 [1,10,3,4,5,5,6,6,8,9] 而我需要 [1,3,4,5,6,8, 9,10]
        • 哈哈,是的,结果是按字典顺序排序的,我的错。虽然这样做的不是 sort() 函数吗? (排序功能是否按字典顺序执行)
        【解决方案6】:

        使用 underscore.js:

        _.union([1, 2, 3], [101, 2, 1, 10], [2, 1]).sort(function(a,b){return a-b});
        => [1, 2, 3, 10, 101]
        

        这个例子直接取自underscore.js,一个流行的补充jQuery的JS库

        【讨论】:

        • [1, 2, 3, 101, 10],似乎排序不正确,因为 OP 还希望对最终结果进行排序。
        【解决方案7】:

        我这样做如下,其中 t1 和 t2 是我的两个表。

        第一个命令将表 t2 的值放到 t1 中。第二个命令从表中删除重复值。

        $.merge(t1, t2);
        $.unique(t1);
        

        【讨论】:

          【解决方案8】:
          function sortUnique(matrix) {
            if(matrix.length < 1 || matrix[0].length < 1) return [];
            const result = [];
            let temp, ele;
            while(matrix.length > 0) {
              temp = 0;
              for(let j=0; j<matrix.length; j++) {
                if(matrix[j][0] < matrix[temp][0]) temp = j;
              }
              if(result.length === 0 || matrix[temp][0] > result[result.length-1]) {
                result.push(matrix[temp].splice(0,1)[0]);
              } else {
                matrix[temp].splice(0,1);
              }
              if(matrix[temp].length===0) matrix.splice(temp, 1);
            }
            return result;
          }
          
          console.log(sortUnique([[1,4,8], [2,4,9], [1,2,7]]))
          

          【讨论】:

            【解决方案9】:

            使用 JavaScript ES6 使其更简单、更简洁。试试这个:

            return [...Arr1, ...Arr2].filter((v,i,s) => s.indexOf(v) === i).sort((a,b)=> a - b);
            

            你有它。您可以在如下函数中构建它:

            function mergeUniqueSort(Arr1, Arr2){
                return [...Arr1, ...Arr2].filter((v,i,s) => s.indexOf(v) === i).sort((a,b)=> a - b);
            }
            

            这就解决了。你也可以使用 ES6 来分解它。使用扩展运算符组合数组:

            let combinedArrays = [...Arr1, ...Arr2]
            

            然后使用filter 函数获取唯一元素:

            let uniqueValues = combinedArrays.filter((value, index, self ) => self.indexOf(value) === index)
            

            最后,您现在对 uniqueValue 对象进行排序:

            let sortAscending  = uniqueValues.sort((a-b) => a - b)   // 1, 2, 3, ....10
            let sortDescending = uniqueValues.sort((b-a) => b - a)   // 10, 9, 8, ....1
            

            所以你可以使用任何部分,以防万一。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-03-04
              • 1970-01-01
              • 2014-01-08
              相关资源
              最近更新 更多