我的数组看起来像这样(每行都是一个数组):
1 2 3
4 5 6
7 8 9
我正在尝试使用第一行-最后一行交替对其进行排序,直到到达中间行。 预期
1 2 3
7 8 9
4 5 6
另一个更大数组上的例子(r,c总是相等,元素是唯一的):
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16 =>
1 2 3 4
13 14 15 16
5 6 7 8
9 10 11 12
我可以使其成为对象并使用objectKeys对其进行排序,但是有更好的解决方案吗?
答案 0 :(得分:1)
如果我正确理解了您的问题,我认为这是解决您问题的一种方法
var x = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
],
f = 0,
r = x.length - 1,
output = [];
while (f <= r) {
output.push(x[f++]);
if (f > r) {
break;
}
output.push(x[r--])
}
console.log(output);
答案 1 :(得分:0)
我无法明确地确定您的算法,但是我建议您使用数组而不是对象,因为它们是为此类数据裁剪的。具体来说,您可以将数据表示为二维数组(数组数组)。
[
[ 1, 2, 3, 4 ],
[ 5, 6, 7, 8 ],
[ 9, 10, 11, 12 ],
[ 13, 14, 15, 16 ]
]
答案 2 :(得分:0)
只需循环...
function my_reorder(L) {
result = [];
let i=0, j=L.length-1;
while (i <= j) {
result.push(L[i++]);
if (i <= j) result.push(L[j--]);
}
return result;
}
在每次迭代中,一个元素从顶部开始向下移动,另一个从底部向上移动。循环内的第二个检查是因为原始数组中的元素数可能是偶数或奇数。
答案 3 :(得分:0)
您可以尝试一个简单的递归模式:
// notice that the compiler version must be the same than our gradle version
kapt 'androidx.databinding:databinding-compiler:3.2.1'
。 注意:result
,array.shift
将使原始数组变异。因此请确保,如果不需要任何副作用,请发送array.pop
的副本
data
黑客方式
对pop和shift使用递归。这将不会处理@ Nikhil Aggarwal所建议的奇数值。为此,您可以将结果的长度设置为输入数组的长度,并且应该很好。
function sortInOrder(arr) {
if(arr.length === 0) return [];
var result = [];
var first = arr.shift();
var last = arr.pop()
if(!!first) result.push(first);
if(!!last) result.push(last);
result = result.concat(sortInOrder(arr));
return result;
}
var data = [
[ 1, 2, 3, 4 ],
[ 5, 6, 7, 8 ],
[ 9, 10, 11, 12 ],
[ 13, 14, 15, 16 ],
[ 17, 18, 19, 20]
];
console.log(sortInOrder(data))
答案 4 :(得分:0)
尝试使用for循环
let arr = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]];
let result = [];
for(let i = 0, j = arr.length; i < j/2; i++) {
result.push(arr[i]);
if(j - i - 1 > i) result.push(arr[j - i - 1]);
}
console.log(result);