javascript - 按第二个单痴呆数组中列出的索引对一维数组进行排序 - JavaScript
问题描述
情况如下:我需要能够重新排序任何一维数组,以便新数组以中心数字(如果对象计数为奇数)或中心 2 数字(如果对象计数为偶数)开始并迭代低,然后高直到原始数组中的所有数字都被计算在内。
示例 1 - 奇数个对象:原始数组:[1,2,3,5,8,13,20] 新数组:[5,3,8,2,13,1,20]
示例 2 - 偶数对象:原始数组:[1,2,3,4] 新数组:[2,3,1,4]
我已经尝试过使用 for 循环并可以假设它工作,但我无法使用 for 循环作为 Vue.js 中的计算属性。
这是我的尝试,但不起作用:
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]));
推荐阅读
- plsql - 如何使用 PLSQL 动态打印唯一数字
- r - 使用 R 包 timevis 和 shiny 创建垂直时间线
- camunda - 使用 singleResult() 方法在 Camunda 中创建的任务为空
- php - 用 PHP 回显 textarea 的值
- postgresql - 尝试使用 Doobie 更新 postgresql 数据库,但没有更新发生
- c++11 - std::function 可以在 C++ 中存储不同的函数签名吗
- visual-c++ - 返回 BSTR 时 DeLeaker 的 MemoryLeak 或误报
- encryption - 关于 ECB、CBC、CFB、CTR 的使用和在哪里的问题
- elasticsearch - 流利的。为什么不将自定义日志传送到 Elasticsearch (EFK)?
- node.js - Firestore 写一个文档需要 2 分钟?