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 @ 2018-05-20 18:56  三瑞  阅读(1404)  评论(0编辑  收藏  举报