[英]javascript sorting 2D array makes duplicates in my array
我试图根据第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。 也许它不正确地支持“排序”功能。 有没有一种方法可以不使用sort函数对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);
}
但是现在数组中没有任何可用的东西。
对于那些问:如果我删除排序函数并按原样使用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;
}
问题的直接答案是“是的,可以在不使用数组的sort方法的情况下对数组进行排序”。 一个使用冒泡排序的简单示例:
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
可能表明Samsung JS引擎有问题,但很有可能不会并产生相同的结果。
由于排序对数组进行了排序,因此您可能希望在排序解决问题之前检查是否创建它的浅表副本。 EG通过将示例中的return语句替换为
return a.slice().sort(functionq) // OR
return bubbleSort(a.slice(), functionq)
JavaScript数组是对象。 对象变量的值是JavaScript引擎用来访问对象属性的某种引用。 引用可以是内存指针或引擎用于访问对象数据的其他某个值。 将对象分配给变量时,其现有内容将被覆盖。 如果将相同的对象值分配给两个变量,则它们将具有相同的引用值并引用相同的对象数据集。
var arry = new Array(50); arry = bubbleSort(arrx);
由于新的Array值在第二行中被覆盖,因此不必要地创建了一个新的Array。 可以简化为
var arry = bubbleSort( arrx).
请注意,JavaScript数组可以增长和收缩,并且没有预先分配的长度。
冒泡排序代码和内置数组sort
方法(由Array.prototype
对象的数组实例继承,并记录在MDN的Array.prototype.sort下)均对数组进行排序,并将对象引用返回到要排序的数组。 后
arry = bubbleSort(arrx); // OR arry = arrx.sort(sortFunction)
的值arry
相同arrx
。 如果要复制不受第一维值的arrx
修改影响的数组,请在排序之前对输入数组进行浅表复制:
arry = bubbleSort(arrx.slice());
如果要创建一个不受任何一个维值修改影响的副本,则可以对两个维的数组进行浅表复制,例如:
arry = bubbleSort( arrx.map(element => element.slice())
这arrx
在排序之前从arrx
两个维度创建新的数组。
如果您在此之后仍收到重复的条目,则需要找出在代码中重复的位置。
检查在使用=
(赋值运算符)而不是==
或===
运算符的条件测试中是否没有错别字来测试是否相等。 这是一种无意中将值分配给不希望更改的对象的好方法。
您需要更改的只是返回排序后的数组。
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.