javascript排序2D数组在我的数组中重复

时间:2017-10-01 05:49:48

标签: javascript arrays sorting

我正在尝试根据第3列对2D数组进行排序。 当我使用sort函数对其进行排序时,所有数组成员都会成为原始数组的一个成员的副本。

所以例如;

我原来的数组:

[12, AAA, eee, 5]
[58, BBB, zzz, 3]
[28, CCC, ddd, 6]
[18, DDD, fff, 9]

我希望它成为:

[18, DDD, fff, 9]
[28, CCC, ddd, 6]
[12, AAA, eee, 5]
[58, BBB, zzz, 3]

我使用代码:

function sortByColumn(a, colIndex){

    a.sort(sortFunctionq);

    function sortFunctionq(a, b) {
        if (a[colIndex] === b[colIndex]) {
            return 0;
        }
        else {
            return (a[colIndex] > b[colIndex]) ? -1 : 1;
        }
    }

    return a;
}

var sorted_a = new Array(15);
sorted_a = sortByColumn(arr, 3);

现在数组变为:

[18, DDD, fff, 9]
[18, DDD, fff, 9]
[18, DDD, fff, 9]
[18, DDD, fff, 9]

我在Samsung Gear手表上使用javascript。也许它不能正确支持“排序”功能。 有没有办法在不使用排序函数的情况下对2D数组进行排序?

最终代码是:

    var sorted_a = new Array(15);
    sorted_a = sortByColumn(arrx, 3);
    arrx= sorted_a;

function bubbleSort(a, fCompare) {
    if( a.length < 2)   {return a;}
    for( var length = a.length-1; length; --length) {
        var noSwaps = true;
        var temp;
        for(var c=0; c<length; ++c) {
            if( fCompare( a[c], a[c+1]) > 0) {
                temp = a[c+1];
                a[c+1] = a[c];
                a[c] = temp;
                noSwaps = false;
            }
        }
        if( noSwaps) {break;}
    }
}

function sortByColumn(a, colIndex){
    function sortFunctionq(a, b) {
        if (a[colIndex] === b[colIndex]) {
            return 0;
        }
        else {
            return (a[colIndex] > b[colIndex]) ? -1 : 1;
        }
    }
    //return bubbleSort(a, sortFunctionq);
    return bubbleSort(a.slice(), sortFunctionq);
}

但现在数组中没有任何内容。

对于那些问: 如果我删除sort函数并按原样使用arrx,我可以使用arrx [1] [1]到达2D数组元素 但是使用上面的代码,arrx [1] [1]返回null。

我稍微改了一下,现在似乎工作了。 但现在我也需要删除重复项。我怎么能这样做?

当前代码:

    var arrx = new Array(50);
    for (var j = 0; j<50; j++){
        arrx[j] = arr[j].split("|+");
    }
    var arry = new Array(50);
    arry = bubbleSort(arrx);

function bubbleSort(a) {
    for( var r = 49; r >= 0; --r) {
        var noSwaps = true;
        var temp = new Array(50);
        for(var c=0; c<r; ++c) {
            if (a[c][3] < a[c+1][3]) {
                temp = a[c+1];
                a[c+1] = a[c];
                a[c] = temp;
                noSwaps = false;
            }
        }
        if( noSwaps) {break;}
    }
    return a;
}

2 个答案:

答案 0 :(得分:0)

直接回答你的问题是“是的,可以在不使用数组的排序方法的情况下对数组进行排序”。使用冒泡排序的一个简单示例:

function bubbleSort(a, fCompare) {
    if( a.length < 2)
        return a;
    for( var length = a.length-1; length; --length) {
        var noSwaps = true;
        var temp;
        for( i=0; i<length; ++i) {
            if( fCompare( a[i], a[i+1]) > 0) {
                temp = a[i+1];
                a[i+1] = a[i];
                a[i] = temp;
                noSwaps = false;
            }
        }
        if( noSwaps)
            break;
    }
}

function sortByColumn(a, colIndex){
    function sortFunctionq(a, b) {
        if (a[colIndex] === b[colIndex]) {
            return 0;
        }
        else {
            return (a[colIndex] > b[colIndex]) ? -1 : 1;
        }
    }
    return bubbleSort(a, sortFunctionq);
}
var a = [
   [12, 'AAA', 'eee', 5],
   [58, 'BBB', 'zzz', 3],
   [28, 'CCC', 'ddd', 6],
   [18, 'DDD', 'fff', 9],
];
 
var sortedA = sortByColumn(a,2)  // updates a in-place, as well
console.log( JSON.stringify(sortedA))

然而

请注意,数组的sort方法和上面的bubbleSort都会更改正在排序的数组中元素的顺序,而不会创建数组的浅表副本。虽然bubbleSort可能表明三星JS引擎存在问题,但很可能不会产生相同的结果。

因为排序对数组进行了排序,您可能希望在排序之前检查是否创建了它的浅表副本来解决问题。 EG通过用

替换示例中的return语句
return a.slice().sort(functionq) // OR
return bubbleSort(a.slice(), functionq)

<小时/>

调试说明:

  1. JavaScript数组是对象。对象变量的值是JavaScript引擎用于访问对象属性的某种引用。引用可以是内存指针或引擎用来访问对象数据的某些其他值。将对象分配给变量时,将覆盖其现有内容。如果将相同的对象值分配给两个变量,它们将保持相同的引用值并引用同一组对象数据。

    var arry = new Array(50);
    arry = bubbleSort(arrx);
    

    不必要地创建一个新的Array,因为新的Array值在第二行被覆盖。它可以简化为

    var arry = bubbleSort( arrx).
    

    请注意,JavaScript数组可以增长和缩小,并且没有预先分配的长度。

  2. 冒泡排序代码和内置数组sort方法(由Array.prototype对象中的数组实例继承,并在Array.prototype.sort下的MDN上记录)对数组进行排序就地并返回对正在排序的数组的对象引用。之后

    arry = bubbleSort(arrx);  // OR
    arry = arrx.sort(sortFunction)
    

    arry的值与arrx相同。如果您想制作一个免于首先arrx修改的数组的副本维度值,在排序之前制作输入数组的浅表副本:

    arry = bubbleSort(arrx.slice());
    

    如果您想制作一个不受任何尺寸值修改影响的副本,请制作两个尺寸数组的浅表副本,例如:

    arry = bubbleSort( arrx.map(element => element.slice())
    

    这会在排序之前从arrx的两个维度创建新数组。

  3. 如果您在此之后仍然收到重复的条目,则需要找出代码中重复项的分配位置。

    <小时/>

    提示

    检查条件测试中是否存在使用=(赋值运算符)而不是=====运算符来测试相等性的拼写错误。这是无意中将值分配给无意改变的事物的好方法。

答案 1 :(得分:-2)

您需要更改的是返回已排序数组。

const data = [
  [12, 'AAA', 'eee', 5],
  [58, 'BBB', 'zzz', 3],
  [28, 'CCC', 'ddd', 6],
  [18, 'DDD', 'fff', 9]
];

function sortByColumn(a, colIndex){
    function sortFunctionq(a, b) {
        if (a[colIndex] === b[colIndex]) {
            return 0;
        }
        else {
            return (a[colIndex] > b[colIndex]) ? -1 : 1;
        }
    }

    return a.sort(sortFunctionq);
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^
}


const result = sortByColumn(data, 3);

console.log(result);