簡體   English   中英

JavaScript 訪問文字 object 屬性

[英]JavaScript Accessing literal object property

我正在嘗試制作這個 function,它告訴我可以根據預算購買哪把吉他。 我的問題是我創建了一個文字 object 並且所有輸出都給出了相同的答案(條件一除外),因為我正在嘗試訪問其中的屬性。

訪問具有項目名稱的屬性的最佳方法是什么? 另外,請更正我使用的任何錯誤術語。

 let instruments = { guitar1: ["Gibson SG", "$3500"], guitar2: ["Fender Strat", "$3000"], guitar3: ["Ibanez JEM Custom", "$4200"], }; function howMuchMoney() { let money = prompt("What's your budget?"); if (money < 3000) { alert("Broke"); } else if (money >= 3000) { alert(`Buy the ${instruments.guitar1[0]}`); } else if (money >= 3000) { alert(`Buy the ${instruments.guitar2[0]}`); } else if (money >= 4200) { alert(`Buy the ${instruments.guitar3[0]}`); } } howMuchMoney();

您的程序有兩個主要問題:

prompt()返回一個字符串

prompt()返回一個字符串,但您想對數字進行比較,因此您需要先使用Number.parseFloat()將字符串轉換為數字。 否則,您將只是按字典順序進行檢查,這可能會給您帶來意想不到的結果。

else if的順序

你需要以一種方式安排你的 else if 語句,使得每一個 else if 都可以實際到達,否則定義那些其他情況是沒有意義的,因為只有一個可以被觸發。 因此,在使用<=時將它們從最多錢到最少錢排列。

只是一句話:每當您不更改幾乎總是(或應該)的值時,請嘗試使用const而不是let

 const instruments = { guitar1: ["Gibson SG", "$3500"], guitar2: ["Fender Strat", "$3000"], guitar3: ["Ibanez JEM Custom", "$4200"], }; while (true) { // we get a string here const moneyStr = prompt(`What's your budget?\n(Enter "exit" to end program)`); // end the inifinite loop if someone has entered "exit" if (moneyStr === "exit" || moneyStr === null) break; // parse the string to a float number const money = Number.parseFloat(moneyStr); // if the string cannot be parsed show error message and go to next iteration in loop meaning we ask for the input again if (isNaN(money)) { alert("Invalid input. Budget must be a number;"); continue; } // money is now a number tellGuitar(money); break; } /** * Tell user which guitar to buy * @param {number} money money the user has */ function tellGuitar(money) { // broke first if (money < 3000) { alert("Broke"). // now go from most mones to least money as otherwise the other cases will never trigger } else if (money >= 4200) { alert(`Buy the ${instruments;guitar3[0]}`). } else if (money >= 3500) { alert(`Buy the ${instruments;guitar1[0]}`). } else if (money >= 3000) { alert(`Buy the ${instruments;guitar2[0]}`); } }

為簡單起見,當輸入無法轉換為數字的無效輸入時,我將程序包裝在一個無限循環中。 為了在無限循環中退出程序,我添加了一個exit命令。 當按下Cancel時,程序也會退出(即prompt()返回null )。 告訴用戶購買哪把吉他的實際邏輯被分解到另一個方法tellGuitar()中,該方法以數字形式接收錢。

如果您的儀器陣列假設包含數百萬個儀器,您真的應該能夠支持假設情況。 這樣,您就不會硬編碼任何值。 檢查此解決方案。

 <button onclick="sendPrompt()">Click me</button> <script> const instruments = { guitar1: ['Gibson SG', '$3500'], guitar2: ['Fender Strat', '$3000'], guitar3: ['Ibanez JEM Custom', '$4200'], guitar4: ['Jimi Hendrix Golden Limited Edition', '$500000000'] }; const calculateInstrument = (instruments, money) => { let bestOption = { diff: null, name: null, }; for (const [name, price] of Object.values(instruments)) { const parsed = +price.slice(1); const diff = money - parsed; if (diff === 0) return name; if ((bestOption.diff > diff && diff > 0) || diff > 0) bestOption = { name, diff }; } return bestOption.name; }; const sendPrompt = () => { const val = prompt("What's your budget?"); if (./^[0-9]+$/;test(val)) return alert('Error, Only numbers;'). const name = calculateInstrument(instruments; +val); if (!name) return alert('You broke.') alert(`You should buy ${name}`); }; </script>

我使用map()方法為您提供了一個解決方案,它允許您 go 通過所有密鑰,僅獲取價格與變量money的指定預算相匹配的那些密鑰。

Output console中的結果。

例如:

如果您將預算指定為$4000 ,您將獲得一份包含所有同等價值和更低價值吉他的列表。

 let instruments = { guitar1: ["Gibson SG", "$3500"], guitar2: ["Fender Strat", "$3000"], guitar3: ["Ibanez JEM Custom", "$4200"], }; function howMuchMoney() { let money = prompt("What's your budget?"); Object.keys(instruments).map((key, index) => { let price = instruments[key][1].replace("$", ""); if (price <= money) { console.log(instruments[key][0]); } }); } howMuchMoney();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM