我有兩組元素,一組包含數字串列和第二組名稱。像這樣的東西。
A: 4,
B: 3,
C: 2,
A: 5,
C: 3,
我的任務是找到具有最小值和最大值的元素。我知道我可以創建物件陣列并使用 map 對其進行排序[{A: 4},{C:2}....]
但我想知道是否有任何有效的方法來做到這一點。而不是創建一個有物件,并使用三個回圈。是否有可能用更有效的東西代替它。像 set 或我可以呼叫set.getItemWithMinValue, set.getItemWithMaxValue
并回傳的東西是:C:2, A:5
對不起,愚蠢的問題,我還在學習。
uj5u.com熱心網友回復:
您將不得不回圈,將物件決議為其值,并檢查該值是更大還是更小。
var data = [
{ A: 4 },
{ B: 3 },
{ C: 2 },
{ A: 5 },
{ C: 3 },
];
const results = data.reduce((minMax, item) => {
const value = Object.values(item)[0];
if (!minMax) {
minMax = {
min: { value, item },
max: { value, item },
}
} else if (minMax.min.value > value) {
minMax.min = { value, item };
} else if (minMax.max.value < value) {
minMax.max = { value, item };
}
return minMax;
}, null);
console.log(results.min.item);
console.log(results.max.item);
uj5u.com熱心網友回復:
這將是一種方法。注意:陣列將在腳本執行程序中更改(排序)。
const arr=[{A: 4},{B: 3},{C: 2},{A: 5},{C: 3}],
val=o=>Object.values(o)[0];
arr.sort((a,b)=>val(a)-val(b));
console.log(arr[0],arr[arr.length-1])
uj5u.com熱心網友回復:
如果你有這些資料
const arr = [{A:2},{A: 4},{B: 3},{C: 2},{A: 5},{C: 3}];
即使您不知道此類物件的屬性,您也可以對其進行迭代。?
const arr = [{A:2},{A: 4},{B: 3},{C: 2},{A: 5},{C: 3}];
const result = arr.sort((prev, next) => {
const prevProp = Object.getOwnPropertyNames(prev);
const nextProp = Object.getOwnPropertyNames(next);
return prev[prevProp] - next[nextProp]
});
console.log('max',result[0]);
console.log('min',result[result.length - 1]);
uj5u.com熱心網友回復:
您可以通過一個回圈從物件中獲取條目。
這種方法只需要一個最小值和最大值。
const
array = [{ A: 4 }, { B: 3 }, { C: 2 }, { A: 5 }, { C: 3 }];
let min, max;
for (const object of array) {
const [[k, v]] = Object.entries(object);
if (!min || min[1] > v) min = [k, v];
if (!max || max[1] < v) max = [k, v];
}
console.log('min', Object.fromEntries([min]));
console.log('max', Object.fromEntries([max]));
這種方法尊重多個具有相同最小值或最大值的名稱。
const
array = [{ A: 4 }, { B: 3 }, { C: 2 }, { A: 5 }, { C: 3 }, { F: 2 }];
let min, max;
for (const object of array) {
const v = Object.values(object)[0];
if (!min || min[1] > v) min = [[object], v];
else if (min[1] === v) min[0].push(object);
if (!max || max[1] < v) max = [[object], v];
else if (max[1] === v) max[0].push(object);
}
console.log('min', min[0]);
console.log('max', max[0]);
uj5u.com熱心網友回復:
這可能是過早的優化,但我將把它留在這里,以防它對任何人有用。當您需要最小值和最大值時,您可以為每兩個物件保存一個比較(即,將其從每個物件兩個比較減少到每兩個物件三個比較),方法是成對取物件,比較這對物件彼此(一次比較),然后僅將較大的與累積的最大值進行比較,僅將較小的與累積的最小值進行比較。
要開始該程序,您可以選擇使用第一個元素初始化最大值和最小值,或者將最大值初始化為前兩個元素中的較大者,將最小值初始化為兩者中的較小者。如果您事先知道有多少元素,則可以根據要掃描的物件的數量是奇數還是偶數來選擇其中一個,這樣掃描將始終是完整的對。
代碼稍微復雜一些,因此只有在性能優勢在您的應用程式中確實顯著時才值得這樣做。或者,我想,作為一種學習練習。
uj5u.com熱心網友回復:
您可以使用Array.prototype.reduce():
const array = [{ A: 4 }, { B: 3 }, { C: 2 }, { A: 5 }, { C: 3 }]
const result = array.reduce((a, c) => {
const [v, max, min] = [c, a.max, a.min].map((o) => Object.values(o)[0])
a.max = max > v ? a.max : c
a.min = min < v ? a.min : c
return a
},
{ max: {}, min: {} })
console.log(result)
或者你可以使用Array.prototype.sort():
const array = [{ A: 4 }, { B: 3 }, { C: 2 }, { A: 5 }, { C: 3 }]
const arraySorted = array.sort((a, b) => {
const [aValue, bValue] = [a, b].map((o) => Object.values(o)[0])
return bValue - aValue
})
const result = {
max: arraySorted[0],
min: arraySorted[arraySorted.length - 1],
}
console.log(result)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/454062.html
標籤:javascript 节点.js 数组 算法 排序
