JS 通过字符串取得对应对象

 

复制代码
//对Array的扩展,查找所有满足条件的元素
    Array.prototype.findAll = function (match) {
        var tmp = [];
        for (var i = 0; i < this.length; i++) {
            if (match(this[i]))
                tmp.push(this[i]);
        }
        return tmp;
    }

/**
    *作者:xrl
    *通过数符串对到实例
    *例如:PRConfig.comboUISet[id][0]、PRConfig.comboUISet[0].comboUIList[id='2']
    */
    String.prototype.GetInstanceOne = function () {
        function GetObjVal(temp, attrStr) {
            if (temp) {
                return temp[attrStr];
            } else {
                return eval(attrStr);
            }
        }

        //检查数据格式是否正确
        function CheckArrayFormat(temp, attrStr) {
            var arrtNameRegExpStr = "([_$A-Za-z][_$0-9A-Za-z]{0,254})";//匹配以_$或字母开头的变量名
            var intRegExpStr = "(0|[1-9]*[1-9][0-9]*)"; //大于0正整数
            var DQMarkRegExpStr = '(\\".*\\")';
            var SQMarkRegExpStr = "(\\'.*\\')";
            var arrtEqualValRegExpStr = "(" + arrtNameRegExpStr + "=(" + DQMarkRegExpStr + "|" + SQMarkRegExpStr + "|" + intRegExpStr + "))";

            var arrtNameRegExp = new RegExp(arrtNameRegExpStr, "i");
            var intRegExp = new RegExp(intRegExpStr, "i");
            var DQMarkRegExp = new RegExp(DQMarkRegExpStr, "i");
            var SQMarkRegExp = new RegExp(SQMarkRegExpStr, "i");
            var arrtEqualValRegExp = new RegExp(arrtEqualValRegExpStr, "g");

            var arrExp = new RegExp("^" + arrtNameRegExpStr + "\\[" + intRegExpStr + "|" + arrtNameRegExpStr + "|" + arrtEqualValRegExpStr+"\\]*$","i");
            if (arrExp.test(attrStr)) {
                //取得变量名
                var varname = attrStr.split('[')[0];
                temp = GetObjVal(temp, varname)//取得该属性名字

                var zkhRegExp =/\[[^\]]*\]/g;
                var zkhStrArr = attrStr.match(zkhRegExp);
                for (var j = 0; j < zkhStrArr.length; j++){
                    var zkhStr = zkhStrArr[j];
                    var zkhStrIn = zkhStr.substring(1, zkhStr.length - 1)
                    if (arrtEqualValRegExp.test(zkhStrIn)) {
                        var zkhStrInArr = zkhStrIn.split('=');
                        var zkhStrInAttrName = zkhStrInArr[0];
                        var zkhStrInAttrVal = zkhStrInArr[1];
                        if (DQMarkRegExp.test(zkhStrInAttrVal) || SQMarkRegExp.test(zkhStrInAttrVal)) {
                            var zkhStrInAttrValSub = zkhStrInAttrVal.substring(1, zkhStrInAttrVal.length - 1)
                            temp = temp.findAll(function (obj) {
                                if (typeof (obj) == "object") {
                                    if (obj[zkhStrInAttrName] == zkhStrInAttrValSub)
                                        return true;
                                }
                                return false;
                            });
                        } else if (intRegExp.test(zkhStrInAttrVal)) {
                            temp = temp.findAll(function (obj) {
                                if (typeof (obj) == "object") {
                                    if (obj[zkhStrInAttrName] == parseInt(zkhStrInAttrValSub))
                                        return true;
                                }
                                return false;
                            });
                        }
                    }else if (intRegExp.test(zkhStrIn)) {
                        temp = GetObjVal(temp, zkhStrIn);
                    } else if (arrtNameRegExp.test(zkhStrIn)) {
                        temp=temp.findAll(function (obj) {
                            if (typeof (obj) == "object") {
                                if (obj[zkhStrIn])
                                    return true;
                            } else if (typeof (obj) == "string") {
                                if (obj == zkhStrIn) {
                                    return true;
                                }
                            }
                            return false;
                        });
                    }
                    //如果返回数组只一条数据就将第一条数据对象转换临时对象返回
                    if (temp && temp.length == 1) {
                        temp = temp[0];
                    }
                }
            } else {
                throw new SyntaxError('Array String Expression Error!');
            }
            return temp;
        }

        var attrPointArr = this.split('.');
        var tempObj = null;
        try {
            for (var i = 0; i < attrPointArr.length; i++) {
                var attrPoint = attrPointArr[i];
                //判断是否有数组情况
                if (attrPoint.indexOf("[") > 0) {
                    tempObj = CheckArrayFormat(tempObj, attrPoint);
                } else {
                    tempObj=GetObjVal(tempObj, attrPoint);
                }
            }
        } catch (e) {
            console.error(e);
            return tempObj;
        }
        return tempObj;
    };
复制代码

 

posted @   三瑞  阅读(1417)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示