【问题标题】:javascript, sort 2 array dependentlyjavascript,对2个数组进行排序
【发布时间】:2013-06-03 00:28:49
【问题描述】:

几个小时以来,我一直试图弄清楚如何独立地对 2 个数组进行排序。

假设我有 2 个数组。

第一个:

array1 = ['zzzzz', 'aaaaaa', 'ccccc'];

第二个:

array2 = [3, 7, 1];

我用array1.sort();对第一个排序,它变成[aaaaaa, cccccc, zzzzzz] 现在我想要的是第二个变成[7, 1, 3]

我认为这很简单,但我正在尝试用更复杂的东西来实现它,我是新人,而且我一直在混淆。

谢谢

【问题讨论】:

  • 在我看来,这几乎是一个键/值对问题。其中 aaaaa 是 7 的键,ccccc 是 1 的键,而 zzzzz 是 3 的键。您的用例是否绝对需要您维护两个不同的数组,或者您愿意将它们组合成一个对象数组,类似于: arr = [{"key":"aaaaaa","value":7},{"key":"zzzzzz","value":3},........] ?

标签: javascript arrays


【解决方案1】:

我会将它们“压缩”到一个对象数组中,然后使用自定义排序回调对其进行排序,然后将它们“解压缩”回您想要的两个数组中:

var array1 = ['zzzzz', 'aaaaaa', 'ccccc'],
    array2 = [3, 7, 1],
    zipped = [],
    i;

for(i=0; i<array1.length; ++i) {
    zipped.push({
        array1elem: array1[i],
        array2elem: array2[i]
    });
}

zipped.sort(function(left, right) {
    var leftArray1elem = left.array1elem,
        rightArray1elem = right.array1elem;

    return leftArray1elem === rightArray1elem ? 0 : (leftArray1elem < rightArray1elem ? -1 : 1);
});

array1 = [];
array2 = [];
for(i=0; i<zipped.length; ++i) {
    array1.push(zipped[i].array1elem);
    array2.push(zipped[i].array2elem);
}

alert('Sorted arrays:\n\narray1: ' + array1 + '\n\narray2: ' + array2);

这是working fiddle

【讨论】:

    【解决方案2】:

    这里有一个简单的函数可以解决问题:

    function sortTogether(array1, array2) {
        var merged = [];
        for(var i=0; i<array1.length; i++) { merged.push({'a1': array1[i], 'a2': array2[i]}); }
        merged.sort(function(o1, o2) { return ((o1.a1 < o2.a1) ? -1 : ((o1.a1 == o2.a1) ? 0 : 1)); });
        for(var i=0; i<merged.length; i++) { array1[i] = merged[i].a1; array2[i] = merged[i].a2; }
    }
    

    Usage demo (fiddle here):

    var array1 = ['zzzzz', 'aaaaaa', 'ccccc'];
    var array2 = [3, 7, 1];
    console.log('Before..: ',array1,array2);
    
    sortTogether(array1, array2); // simply call the function
    
    console.log('After...: ',array1,array2);
    

    输出:

    Before..:  ["zzzzz", "aaaaaa", "ccccc"] [3, 7, 1]
    After...:  ["aaaaaa", "ccccc", "zzzzz"] [7, 1, 3] 
    

    【讨论】:

      【解决方案3】:

      您可以创建一个对象数组,其中对象的一个​​属性是字符串(包含“aaaaa”、“cccccc”、“zzzzzz”),另一个是数字(7 ,1,3)。这样,您将只有一个数组,您 can sort by any property 和另一个属性将保持同步。

      【讨论】:

        【解决方案4】:

        碰巧我有一些旧代码可以解决问题:

        function arrVirtualSortGetIndices(array,fnCompare){
            var index=array.map(function(e,i,a){return i;});
            fnCompare=fnCompare || defaultStringCompare;
            var idxCompare=function (aa,bb){return fnCompare(array[aa],array[bb]);};
            index.sort(idxCompare);
            return index;
        
            function defaultStringCompare(aa,bb){
                if(aa<bb)return -1;
                if(bb<aa)return 1;
                return 0;
            }
            function defaultNumericalCompare(aa,bb){
                return aa-bb;
            }   
        }
        
        function arrReorderByIndices(array,indices){
            return array.map(
                function(el,ix,ar){
                    return ar[indices[ix]];
                }
            );
        }
        
        var array1 = ['zzzzz', 'aaaaaa', 'ccccc'];
        var array2 = [3, 7, 1];
        var indices=arrVirtualSortGetIndices(array1);
        var array2sorted=arrReorderByIndices(array2,indices);
        array2sorted;
        
        /*
        7,1,3
        */
        

        对不起,我不做'fors'。至少在我不需要的时候不会。

        还有fiddle


        另外,fiddle 的替代方法是在给定这样的对象数组时对结果进行排序:

        给定:

        var list = [
            {str:'zzzzz',value:3},
            {str:'aaaaa',value:7},
            {str:'ccccc',value:1}
        ];
        

        输出:

        [
          {str: "aaaaa", value: 7},
          {str: "ccccc", value: 1},
          {str: "zzzzz", value: 3}
        ]
        

        【讨论】:

          【解决方案5】:

          假设:

          • 数组长度相同(您的问题暗示了这一点)
          • 可以将内容与&gt;&lt; 进行比较(在您的示例中为true,但我想澄清一下,这里是假设的)

          那么我们就可以使用插入排序了。

          var value,len = array1.length;
          for (i=0; i < len; i++) {
                  value = array1[i];
                  for (j=i-1; j > -1 && array1[j] > value; j--) {
                      array1[j+1] = array1[j];
                      array2[j+1] = array2[j];
                  }
          
                  items[j+1] = value;
           }
          

          【讨论】:

          • OP 要求没有循环的可能解决方案
          • @YuriyGalanter "如果可能的话,我想要一个只有 "fors" 和 ifs"" 的解决方案,他要求一个 WITH 循环
          • @YuriyGalanter 虽然他现在已经完全删除了对循环的任何引用。
          • 这段代码甚至不起作用,最后一个items 没有在任何地方定义。应该是array2[j+1]=value
          【解决方案6】:

          使用找到here 的解决方案在对数组进行排序后查找新索引,您可以像这样将这些索引应用于array2

          function sortWithIndices(toSort) {
            for (var i = 0; i < toSort.length; i++) {
              toSort[i] = [toSort[i], i];
            }
            toSort.sort(function(left, right) {
              return left[0] < right[0] ? -1 : 1;
            });
            toSort.sortIndices = [];
            for (var j = 0; j < toSort.length; j++) {
              toSort.sortIndices.push(toSort[j][2]);
              toSort[j] = toSort[j][0];
            }
            return toSort;
          }
          
          
          var array1 = ['zzzz', 'aaaa', 'cccc'];
          var array2 = [3, 7, 1];
          
          // calculate the indices of array1 after sorting. (attached to array1.sortIndices)
          sortWithIndices(array1);
          
          // the final array after applying the sorted indices from array1 to array2
          var final = [];
          
          // apply sorted indices to array2
          for(var i = 0; i < array1.sortIndices.length; i++)
              final[i] = array2[array1.sortIndices[i]];
          
          // output results
          alert(final.join(","));
          

          JSFiddle Demo

          【讨论】:

            猜你喜欢
            • 2015-03-16
            • 1970-01-01
            • 1970-01-01
            • 2022-12-13
            • 2014-02-11
            • 2021-11-20
            • 2022-01-18
            • 1970-01-01
            • 2018-04-19
            相关资源
            最近更新 更多