Dapatkan dan sahkan laluan dalam objek bersarang - guna fungsi #2

Linda Hamilton
Lepaskan: 2024-11-19 21:19:03
asal
957 orang telah melayarinya

Get and verify paths in a nested object - util functions #2

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.

  • getDataFromObj(obj, laluan): dapatkan semula data daripada laluan tertentu dalam objek
  • isValidObjPath(obj, laluan): sahkan jika laluan yang diberikan wujud dalam objek

getDataFromObj(obj, laluan)

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
 */
Salin selepas log masuk

penggunaan:

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"]))
Salin selepas log masuk

isValidObjPath(obj, laluan)

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
 */
Salin selepas log masuk

penggunaan:

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"]))
Salin selepas log masuk

Mengapa tatasusunan sebagai laluan dan bukannya rentetan dengan garis miring atau titik? (cth. "komputer.komputer riba")

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!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan