javascript根据最小-最大位置对数组进行排序

时间:2018-12-01 07:14:15

标签: javascript arrays

我的数组看起来像这样(每行都是一个数组):

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对其进行排序,但是有更好的解决方案吗?

5 个答案:

答案 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)

您可以尝试一个简单的递归模式:

  • 检查Array是否有项目,
    • 如果是,请选择第一项和最后一项。
    • 如果元素存在,则推至// notice that the compiler version must be the same than our gradle version kapt 'androidx.databinding:databinding-compiler:3.2.1'
    • 重复剩余数组的过程。
  • 否则,返回一个空白数组并停止。

注意resultarray.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);