![](/img/trans.png)
[英]Add a default value for a json property when it doesn't exist in Javascript
[英]Get boolean property, or default true if it doesn't exist
在 javascript 中,是否有更好的方法來獲取 object 上的 boolean 屬性的值,但如果該屬性不存在,則默認為 true ,而不是下面?
(typeof myObj.myProp !== "undefined" ? myObj.myProp : true);
我覺得必須有更好的方法來做到這一點。
測試用例...
myObj = {}; // return true
myObj = { myProp: false; } // return false;
myObj = { myProp: true; } // return true
ECMAScript 2020 引入了空值合並運算符??
:
const test = obj => obj.myProp?? true; console.log( test({}) ); // return true console.log( test({ myProp: false }) ); // return false console.log( test({ myProp: true }) ); // return true
但是,在此之前存在的選擇並不多。 您當前的代碼(typeof myObj.myProp?== "undefined". myObj:myProp : true)
可能是舊環境中最好的代碼。
如果您確實必須經常處理它們並且無效性是一個持續存在的問題,那么您可以制作一個簡單的包裝器來安全地獲取可能不存在的值:
function Safe(val) { return { get: function(prop) { if (val == null) return Safe(null); return Safe(val[prop]); }, orElse: function(fallbackValue) { if (val == null) return fallbackValue; return val } } }; console.log( //true Safe({}).get("myProp").orElse(true) ) console.log( // false Safe({ myProp: false }).get("myProp").orElse(true) ); console.log( // true Safe({ myProp: true }).get("myProp").orElse(true) ); var complexObject = { level1: { level2: { myProp: false } } }; console.log( // { "level2": { "myProp": false } } Safe(complexObject).get("level1").orElse(true) ); console.log( // { "myProp": false } Safe(complexObject).get("level1").get("level2").orElse(true) ); console.log( // false Safe(complexObject).get("level1").get("level2").get("myProp").orElse(true) ); console.log( // true Safe(complexObject).get("level1").get("level2").get("level3").get("myProp").orElse(true) );
.as-console-wrapper { max-height: 100%;important; }
此處的 API 仿照 Java 的Optional
但非常簡化。 關鍵是要表明,如果經常出現這種情況,可以進行更安全的處理。
Java 中的Optional
在其他地方也稱為Option
或Maybe
,更正式地編碼可能是null
的處理值。 要了解更多如何做到這一點,請參閱GitBooks上的函數式編程最充分指南的這一章(或使用 ES5 語法的舊版本)
除了編寫自己的安全處理之外,另一種替代方法是使用支持它的庫,例如 Lodash 的_.get()
:
console.log( //true _.get({}, "myProp", true) ); console.log( // false _.get({ myProp: false }, "myProp", true) ); console.log( // true _.get({ myProp: true }, "myProp", true) ); var complexObject = { level1: { level2: { myProp: false } } }; console.log( // { "level2": { "myProp": false } } _.get(complexObject, "level1", true) ); console.log( // { "myProp": false } _.get(complexObject, [ "level1", "level2"], true) ); console.log( // false _.get(complexObject, [ "level1", "level2", "myProp"], true) ); console.log( // true _.get(complexObject, [ "level1", "level2", "level3", "myProp"], true) );
.as-console-wrapper { max-height: 100%;important; }
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.