根据第二个一维数组JavaScript中列出的索引对一维数组进行排序



情况如下:我需要对任何一维数组重新排序,以便新数组从中心数(如果对象计数为奇数(或中心2个数字(如果对象数为偶数(开始,先低后高迭代,直到原始数组中的所有数字都被计算在内。

示例1-奇数个对象:原始数组:[1,2,3,5,8,13,20]新阵列:[5,3,8,2,1,20]

示例2-偶数个对象:原始数组:[1,2,4]新阵列:[2,3,1,4]

我已经用for循环尝试过了,可以让它假设地工作,但我不能在Vue.js.中使用for循环作为计算属性


这是我的尝试,但不起作用:

gameInfo: {
cards: [1, 2, 3, 6, 8, 13, 21, 40, 1000],
}
reorderOddCards() {
ATTEMPT 1
const cardCount = this.gameInfo.cards.length;
const middleNumber = (cardCount / 2).toFixed(0);
const newCardOrder = this.gameInfo.cards.map(addToArray);
function addToArray(value, index) {
if (index < middleNumber) {
const newIndex = (((middleNumber - index) * 2) - 1);
newCardOrder.splice(newIndex, 1, value);
} else if (index === middleNumber) {
newCardOrder.splice(index, 1, value);
} else {
const newIndex = ((middleNumber - index) * 2);
newCardOrder.splice(newIndex, 1, value);
}
}
return newCardOrder;
},

这里有一个使用.sort函数的看似更好的方法,但我似乎也无法使其工作。

潜在解决方案

这可以通过简单的while循环来实现。这里的关键是找到中间的索引。在奇数长度的数组中,只有一个中心,我们可以认为它的左右中心在同一点上,从而推广解。该指数将是地板长度除以二的结果。正确的索引也将始终是此值。然而,对于偶数长度的数组,我们需要将左索引减少一。计算完这些索引后,我们循环,同时递减左索引和递增右索引,将值添加到结果数组中。

function order(arr){
let right = Math.floor(arr.length / 2);
let left = right - (arr.length % 2 == 1 ? 0: 1);
let res = left === right ? [arr[left]] : arr.slice(left, right + 1);
while(left > 0){
res.push(arr[--left]);
res.push(arr[++right]);
}
return res;
}
console.log(...order([1,2,3,5,8,13,20]));
console.log(...order([1,2,3,4]));

最新更新