我有一個物件,其中包含未定義數量的子物件,這些子物件由數值關聯為物件鍵。我需要的是一種傳入數字(貨幣)并獲取最接近我傳入函式的數字的子物件的方法。
示例物件結構
{
"32.5": [
{
"key": "value",
"key": "value"
},
{
"key": "value",
"key": "value"
}
],
"34": [
{
"key": "value",
"key": "value"
}
],
"35.5": [
{
"key": "value",
"key": "value"
}
]
}
物件的鍵是字串,所以我已經發現我可能必須以某種方式將物件鍵決議為一個數字以進行比較,但我完全不知道如何將它們聯系在一起。
我宣告了一個函式,它接受 3 個引數,最后應該回傳子物件,其中它的鍵最接近我的輸入引數。
function getNearest(obj, decimalNumber, below_or_above)
當我輸入“上方”時,我想獲得最近的鍵,其中它的數值是下一個更高的,當我輸入“下方”時,它將回傳下一個物件,其中它的數字鍵是下一個較小的。
如果我呼叫 getNearest(obj, 33.4, above) 它應該回傳帶有鍵“34”的物件。
我希望我設法以某種方式解釋,以便每個人都能理解..
這是我想出的起點,但我不知道如何從這里開始
function getNearest(obj, decimalNumber, above_or_below){
const keys = [];
Object.keys(obj).forEach(key =>{
let numericKey = Number(key);
keys.push(numericKey);
})
//store all numeric keys in array to further process later on
}
uj5u.com熱心網友回復:
- 使用Object.entries將物件轉換為專案陣列。
- 使用Array.prototype.map回圈物件并將字串鍵轉換為數字,以正確執行比較。
- 使用Array.prototype.sort按鍵對陣列進行排序。
pos使用Array.prototype.find根據引數查找鍵。- 最后回傳找到的鍵對應的值。
const
data = { 32.5: [{ key: "32.5" }], 34: [{ key: "34" }], 35.5: [{ key: "35.5" }] },
getKey = (obj, target, pos) =>
Object.entries(obj)
.map(([k, v]) => [Number(k), v])
.sort(([a], [b]) => a - b)
.find(([k]) => (pos === "above" ? k >= target : k <= target))?.[1];
console.log(getKey(data, 33, "above")); // [{ key: '34' }]
console.log(getKey(data, 33, "below")); // [{ key: '32.5' }]
console.log(getKey(data, 37, "above")); // undefined
console.log(getKey(data, 30, "below")); // undefined
uj5u.com熱心網友回復:
你可以
- 從物件中獲取密鑰,
- 地圖編號,
- 排序陣列以調整原生物件排序(positv 32 位整數優先),
- 通過檢查是否小于值或命中最后一項或實際和下一項的絕對增量是否更小來查找值。
value below above
------- ------- -------
0 undef 32.3
31.4 undef 32.3
32.5 32.3 34
32.8 32.3 34
33.4 32.3 34
34 34 34
35.1 34 35.5
35.5 35.5 35.5
50 35.5 undef
isAbove false true
const
getKey = (object, value, isAbove) => Object
.keys(object)
.map(Number)
.sort((a, b) => a - b)
.find((v, i, a) => isAbove
? v >= value
: v <= value && (a[i 1] > value || i 1 === a.length)
),
data = { 32.5: [{}], 34: [{}], 35.5: [{}] };
console.log('below');
console.log(getKey(data, 0)); // 32.3
console.log(getKey(data, 31.4)); // 32.3
console.log(getKey(data, 32.5)); // 32.3
console.log(getKey(data, 32.8)); // 32.3
console.log(getKey(data, 33.4)); // 34
console.log(getKey(data, 34)); // 34
console.log(getKey(data, 35.1)); // 35.5
console.log(getKey(data, 35.5)); // 35.5
console.log(getKey(data, 100)); // 35.5
console.log('above');
console.log(getKey(data, 0, true)); // 32.3
console.log(getKey(data, 31.4, true)); // 32.3
console.log(getKey(data, 32.5, true)); // 32.3
console.log(getKey(data, 32.8, true)); // 32.3
console.log(getKey(data, 33.4, true)); // 34
console.log(getKey(data, 34, true)); // 34
console.log(getKey(data, 35.1, true)); // 35.5
console.log(getKey(data, 35.5, true)); // 35.5
console.log(getKey(data, 100, true)); // 35.5
.as-console-wrapper { max-height: 100% !important; top: 0; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/475829.html
標籤:javascript 节点.js
上一篇:僅選擇單擊的按鈕JQuery
