Semalam saya telah berkongsi dengan anda fungsi utiliti untuk menggelungkan objek secara berulang dalam JS, salah satu ciri yang ada padanya, ialah anda boleh mendapatkan tatasusunan dengan laluan ke objek bersarang yang sedang digelung. Walau bagaimanapun, apabila bekerja dengan objek bersarang, anda mungkin ingin mendapatkan semula atau mengesahkan data daripada laluan tertentu pada bila-bila masa, itulah yang dilakukan oleh fungsi utiliti hari ini.
Sila salin dan tampal kod ini
/** * Retrieves data from an object on a given path * @param {Object} obj the object to get the data from * @param {string[]} path an array of strings containing the keys of the object to look at * @returns {*} the retrieved data or a Reference Error if not found */ function getDataFromObj(obj, path){ // Validate arguments if(getType(obj) != "object"){ throw TypeError("The `obj` argument is not an object"); } if(getType(path) != "array"){ throw TypeError("The `path` argument is not an array"); } // Get the data or a ReferenceError if not found const data = (()=>{ let currentData = obj; for(let i = 0; i < path.length; i +=1 ){ if(Object.keys(currentData).includes(path[i])){ currentData = currentData[path[i]]; continue; } else{ currentData = ReferenceError("The object path is not defined"); break; } } return currentData; })(); return data; } /** * A method to detect data types more accurately * Credits: Chris Ferdinandi, https://gomakethings.com/ * @param {*} data the data to be verified * @returns {String} the data type */ function getType(data){ return Object.prototype.toString.call(data).toLowerCase().slice(8, -1) } /** * License: MIT, https://opensource.org/license/mit * Copyright (c) 2024 Rodrigo Isaias Calix */
Anda mesti lulus 2 hujah:
obj: Objek dari mana anda ingin mendapatkan semula data
laluan: Tatasusunan yang menunjukkan urutan untuk diikuti
Jika laluan wujud ia akan mengembalikan nilai (walaupun nilainya tidak ditentukan), jika laluan itu tidak wujud ia akan mengembalikan objek ReferenceError, ia tidak membuang ralat, hanya mengembalikan objek ralat.
const products = { computers: { laptop: 20, desktop: 15, mini: 8 }, cameras: 20, externalDevices: { keyboard: { usb: 45, bluetooth: 25, other: undefined } } } // This would log 25 console.log(getDataFromObj(products, ["externalDevices", "keyboard", "bluetooth"])) // this would return a ReferenceError object (not a throw, just the error object) console.log(getDataFromObj(products, ["externalDevices", "mouse"])) // this would return `undefined` console.log(getDataFromObj(products, ["externalDevices", "keyboard", "other"]))
Kod utiliti:
/** * verify if an object has an specific path * @param {Object} obj the object to be verified * @param {string[]} path an array of strings containing the keys of the object to look at * @returns {Boolean} `true` if found, otherwise `false` */ function isValidObjPath(obj, path){ // Validate arguments if(getType(obj) != "object"){ throw TypeError("The `obj` argument is not an object"); } if(getType(path) != "array"){ throw TypeError("The `path` argument is not an array"); } // shallow copy of the object to be verified let currentData = obj; // Verify the path for(let i = 0; i < path.length; i +=1 ){ if(Object.keys(currentData).includes(path[i])){ currentData = currentData[path[i]]; continue; } else{ return false; } } return true; } /** * A method to detect data types more accurately * Credits: Chris Ferdinandi, https://gomakethings.com/ * @param {*} data the data to be verified * @returns {String} the data type */ function getType(data){ return Object.prototype.toString.call(data).toLowerCase().slice(8, -1) } /** * License: MIT, https://opensource.org/license/mit * Copyright (c) 2024 Rodrigo Isaias Calix */
Anda mesti lulus 2 hujah:
obj: Objek yang anda ingin sahkan jika laluan wujud
laluan: Tatasusunan yang menunjukkan urutan untuk diikuti
Jika laluan yang anda cari wujud, ia akan kembali benar, jika tidak ia akan kembali palsu
const products = { computers: { laptop: 20, desktop: 15, mini: 8 }, cameras: 20, externalDevices: { keyboard: { usb: 45, bluetooth: 25, other: undefined } } } // This would log true console.log(isValidObjPath(products, ["externalDevices", "keyboard", "bluetooth"])) // this would log false console.log(isValidObjPath(products, ["externalDevices", "mouse"])) // this would log true console.log(isValidObjPath(products, ["externalDevices", "keyboard", "other"]))
Oleh kerana nama sifat objek juga boleh menjadi rentetan dengan set julat besar aksara, yang termasuk titik, jadi, sebagai contoh, "computers.laptop": {[...]} akan menjadi objek yang sah, tatasusunan akan membolehkan lebih fleksibiliti dan ketepatan.
Jika anda mendapati ini berguna, saya akan berkongsi lebih banyak kandungan seperti ini di DEV!
Anda juga boleh mencari saya di X: https://x.com/schemetastic
Dan ingat untuk menyimpannya untuk kemudian ?
Atas ialah kandungan terperinci Dapatkan dan sahkan laluan dalam objek bersarang - guna fungsi #2. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!