gpt4 book ai didi

javascript - 交换数组中除 first 和 last 之外的所有元素

转载 作者:行者123 更新时间:2023-12-02 05:27:59 24 4
gpt4 key购买 nike

我有一个看起来像这样的数组

const x = ['A','B','C','D','E']

我想要一个优雅的函数来打乱数组的内容,但保持第一个或最后一个元素固定。像 customShuffle(x) 这样的东西会打乱数组,但确保元素 "A" 位于第一个位置,元素 "E" 将在最后一个位置。所有其他元素都被打乱。

最佳答案

如果数组的第一个和最后一个元素始终位于同一个位置,您可以应用普通的混洗算法,例如 Fisher and Yates' 的现代变体。 , 跳过那些位置:

function customShuffle(arr) {
if (arr.length < 3) {
return arr;
}

// Note the -2 (instead of -1) and the i > 1 (instead of i > 0):

for (let i = arr.length - 2; i > 1; --i) {
const j = 1 + Math.floor(Math.random() * i);
[arr[i], arr[j]] = [arr[j], arr[i]];
}

return arr;
}

console.log(customShuffle([1, 2, 3, 4, 5]).join(', '));
console.log(customShuffle(['A', 'B', 'C', 'D', 'E']).join(', '));
.as-console-wrapper {
max-height: 100vh;
}

否则,如果您想选择第一个和最后一个元素,正如您在原始问题中指出的那样,您可以这样做:

  1. 首先在第一个和最后一个位置找到您想要的元素的索引:firstIndexlastIndex
  2. 如果这些元素存在(它们可能不存在),将它们从数组中移除。
  3. 对剩余元素应用混洗算法(无需混洗 firstlast)。
  4. 如果需要,将第一个和最后一个元素添加回它们的位置。

function customShuffle(arr, first, last) {
// Find and remove first and last:

const firstIndex = arr.indexOf(first);
if (firstIndex !== -1) arr.splice(firstIndex, 1);

const lastIndex = arr.indexOf(last);
if (lastIndex !== -1) arr.splice(lastIndex, 1);

// Normal shuffle with the remainign elements using ES6:

for (let i = arr.length - 1; i > 0; --i) {
const j = Math.floor(Math.random() * (i + 1));
[arr[i], arr[j]] = [arr[j], arr[i]];
}

// Add them back in their new position:

if (firstIndex !== -1) arr.unshift(first);
if (lastIndex !== -1) arr.push(last);

return arr;
}

console.log(customShuffle([1, 2, 3, 4, 5], 5, 1).join(', '));
console.log(customShuffle(['A', 'B', 'C', 'D', 'E'], 'E', 'C').join(', '));
console.log(customShuffle([1, 2, 3, 4, 5], 10, 20).join(', '));
.as-console-wrapper {
max-height: 100vh;
}

关于javascript - 交换数组中除 first 和 last 之外的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50536044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com