第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何驗(yàn)證深度嵌套的對(duì)象結(jié)構(gòu)

如何驗(yàn)證深度嵌套的對(duì)象結(jié)構(gòu)

千萬(wàn)里不及你 2021-12-12 17:49:12
我已經(jīng)定義了具有嵌套屬性的對(duì)象。我想創(chuàng)建一個(gè)驗(yàn)證器函數(shù),它將檢查另一個(gè)對(duì)象是否與我定義的對(duì)象具有相同的結(jié)構(gòu)和值類型!是對(duì)象的定義:const OBJECT_SCHEMA = {  name: String,  data: [{    isSelected: Boolean,    mId: String,    mSummary: String,    mMarkets: Array,    mBdd: String,    mReplaceDict: Object,    omId: String,    omnSummary: String,    omnMarkets: Array,    omnBdd: String,    omnReplaceDict: {      id: String,      text: String,    },  }],  metadata: {    emails: Array,    description: String,  },};這是我用于驗(yàn)證的功能。目前它僅適用于一個(gè)嵌套級(jí)別!我希望它使用許多嵌套級(jí)別進(jìn)行驗(yàn)證。function validateObjectStructure(schema, obj) {  let valid = true;  firstLevel: for(const k in schema) {    if(schema[k].constructor === Array) { // if prop is of type array      let i;      for(i = 0; i < schema[k].length; i++) {        for(const kk in schema[k][i]) {          if(!obj[k][i].hasOwnProperty(kk) || obj[k][i][kk].constructor !== schema[k][i][kk]) {            valid = false;            break firstLevel;          }        }      }    }    else if(schema[k].constructor === Object) { // if prop is of type object      for(const kk in schema[k]) {        if(!obj[k].hasOwnProperty(kk) || obj[k][kk].constructor !== schema[k][kk]) {          valid = false;          break firstLevel;        }      }    }    else { // if prop is simple type      if(!obj.hasOwnProperty(k) || obj[k].constructor !== schema[k]) {        valid = false;        break;      }    }  }  return valid;}
查看完整描述

2 回答

?
交互式愛(ài)情

TA貢獻(xiàn)1712條經(jīng)驗(yàn) 獲得超3個(gè)贊

您是否需要使用 的嵌套級(jí)別obj?如果是,你可以做這樣的事情而不是最后一行:


Object.values(obj).reduce((accValid, value) => {

  if (typeof value === 'object') {

    return accValid && validateObjectStructure(schema, value);

  }

  return accValid;

}, valid);


return valid;


查看完整回答
反對(duì) 回復(fù) 2021-12-12
?
心有法竹

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊

這是一個(gè)可能的實(shí)現(xiàn):


function validate(obj, schema, path = '') {

    let ok = true;


    if (!obj)

        ok = obj === schema;

    else if (typeof schema === 'function')

        ok = obj.constructor === schema;

    else if (typeof obj !== 'object')

        ok = obj === schema;

    else if (Array.isArray(schema))

        ok = Array.isArray(obj) && obj.every((x, k) => validate(x, schema[0], path + '[' + k + ']'));

    else {

        let ko = Object.keys(obj);

        let ks = Object.keys(schema);

        ok = ko.length === ks.length && ks.every(k => validate(obj[k], schema[k], path + '.' + k));

    }

    if (!ok)

        throw new Error('FAILED ' + path);

    return true;

}


// example:



const OBJECT_SCHEMA = {

    name: String,

    data: [{

        isSelected: Boolean,

        mId: String,

        omnReplaceDict: {

            id: String,

            text: {

                deepObj: {

                    deepProp: [Number]

                }


            },

        },

    }],

};


const obj = {

    name: "foo",

    data: [{

        isSelected: true,

        mId: "bar",

        omnReplaceDict: {

            id: "foo",

            text: {

                deepObj: {

                    deepProp: [1, 2, "???", 3]

                }


            },

        },

    }]

};



validate(obj, OBJECT_SCHEMA)


注意:雖然這個(gè)自制的類型檢查器看起來(lái)工作正常,但它非常有限(例如如何表達(dá)“字符串?dāng)?shù)字對(duì)的數(shù)組”或“null 或某個(gè)對(duì)象”?),所以它可能是使用一個(gè)選項(xiàng)真正的,就像打字稿一樣。有關(guān)可能的實(shí)現(xiàn),請(qǐng)參見此處。


查看完整回答
反對(duì) 回復(fù) 2021-12-12
  • 2 回答
  • 0 關(guān)注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)