我正在尝试根据第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;
}
答案 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)
<小时/>
JavaScript数组是对象。对象变量的值是JavaScript引擎用于访问对象属性的某种引用。引用可以是内存指针或引擎用来访问对象数据的某些其他值。将对象分配给变量时,将覆盖其现有内容。如果将相同的对象值分配给两个变量,它们将保持相同的引用值并引用同一组对象数据。
var arry = new Array(50);
arry = bubbleSort(arrx);
不必要地创建一个新的Array,因为新的Array值在第二行被覆盖。它可以简化为
var arry = bubbleSort( arrx).
请注意,JavaScript数组可以增长和缩小,并且没有预先分配的长度。
冒泡排序代码和内置数组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
的两个维度创建新数组。
如果您在此之后仍然收到重复的条目,则需要找出代码中重复项的分配位置。
<小时/>
检查条件测试中是否存在使用=
(赋值运算符)而不是==
或===
运算符来测试相等性的拼写错误。这是无意中将值分配给无意改变的事物的好方法。
答案 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);