我有这个数组:
var arr = [5, 3, 2, 8, 1, 4];
我正尝试仅对奇数值的元素进行排序,所以我想要
输出:
[1, 3, 2, 8, 5, 4]
您可以看到偶数元素不会更改其位置。谁能告诉我我所缺少的吗?这是我的代码:
function myFunction(array) {
var oddElements = array.reduce((arr, val, index) => {
if (val % 2 !== 0){
arr.push(val);
}
return arr.sort();
}, []);
return oddElements;
}
console.log(myFunction([5, 3, 2, 8, 1, 4]));
我知道我可以使用slice将元素添加到数组中,但是我对如何获取索引并将元素放入数组中感到困惑。
答案 0 :(得分:8)
首先仅对奇数数字进行排序,然后将其放入数组oddSorted
中。然后map
遍历原始数组中的每个元素,并检查当前元素是否为 odd ,如果 odd 将其替换为{{1 }}数组。
oddSorted
答案 1 :(得分:5)
一种选择是跟踪原始数组中的奇数索引,然后.reduce
进行排序和排序之后,从排序的奇数数组中进行遍历原始奇数索引并重新分配:< / p>
function oddSort(array) {
const oddIndicies = [];
const newArr = array.slice();
const sortedOdd = array.reduce((arr, val, index) => {
if (val % 2 !== 0) {
arr.push(val);
oddIndicies.push(index);
}
return arr;
}, [])
.sort((a, b) => a - b);
while (oddIndicies.length > 0) {
newArr[oddIndicies.shift()] = sortedOdd.shift();
}
return newArr;
}
console.log(oddSort([5, 3, 2, 8, 1, 4]));
console.log(oddSort([5, 3, 2, 8, 1, 4, 11 ]));
答案 2 :(得分:0)
我稍微修改了您的代码以实现您的目标。在下面看看
function myFunction(array) {
var oddElements = array.reduce((arr, val, index) => {
if (val % 2 !== 0) {
arr.push(val);
}
return arr.sort(function(a, b){return a - b});
}, []);
var index = 0;
var finalElements = [];
for(var i=0; i<array.length; i++) {
var element = array[i];
if(element %2 !==0) {
finalElements.push(oddElements[index]);
index++;
} else {
finalElements.push(element);
}
}
return finalElements;
}
console.log(myFunction([5, 3, 2, 8, 1, 4, 11]));
请记住,默认的排序功能按字母顺序对值进行排序。这就是为什么您不能只使用arr.sort()