迭代时对对象数组进行排序-JavaScript



我有一个对象数组,我正在迭代并将其推送到一个新数组
我还希望新数组将按特定值排序(不使用.sort(((阵列

arr1 = [
{name: "three", value: 16}
{name: "one", value: 2}
{name: "two", value: 12}
]

想要的结果

arr2 = [
{name: "one", value: 2},
{name: "two", value: 12},
{name" "three", value: 16}
]

尝试

arr1.forEach(item => {
if (arr2.length) {
const lastObj = arr2[arr2.length - 1];
if (item.value > lastObj.value) {
arr2.push(item)
} else {
arr2.unshift(item)
}
} else {
arr2.push(item)
}
}) 

与单个值进行比较是行不通的,因为下一个值可能在前一个元素之间。排序是一个非常复杂的问题,计算机科学对此进行了广泛的研究。如果你不想接触你的原始数组,只需在排序前克隆它:

arr1 = [
{name: "three", value: 16},
{name: "one", value: 2},
{name: "two", value: 12}
]
arr2 = [...arr1].sort((a, b) => a.value - b.value);
console.log(arr2);

只需根据值对数组进行排序

const arr1 = [
{name: "three", value: 16},
{name: "one", value: 2},
{name: "two", value: 12},
];
const output = arr1.sort((a,b) => a.value - b.value);
console.log(output);

merge是一种不用sort((进行排序的好方法

arr1 = [
{name: "three", value: 16},
{name: "one", value: 2},
{name: "two", value: 12}
]
console.log(mergeSort(arr1))
function mergeSort(arr)
{
if (arr.length < 2)
return arr;
var middle = parseInt(arr.length / 2);
var left   = arr.slice(0, middle);
var right  = arr.slice(middle, arr.length);
return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right)
{
var result = [];
while (left.length && right.length) {
if (left[0].value <= right[0].value) {
result.push(left.shift());
} else {
result.push(right.shift());
}
}
while (left.length)
result.push(left.shift());
while (right.length)
result.push(right.shift());
return result;
}

您无法将实际值与排序数组值中未定义的值进行比较。它摧毁了一切,你的想法。

最新更新