首页 > 试题广场 >

请实现方法 parse

[问答题]

请实现方法 parse ,作用如下:

var object = {
 b: { c: 4 }, d: [{ e: 5 }, { e: 6 }]
};
console.log( parse(object, ‘b.c’) == 4 ) //true 
console.log( parse(object, ‘d[0].e’) == 5 ) //true
console.log( parse(object, ‘d.0.e’) == 5 ) //true
console.log( parse(object, ‘d[1].e’) == 6 ) //true
console.log( parse(object, ‘d.1.e’) == 6 ) //true
console.log( parse(object, ‘f’) == ‘undefined’ ) //true

我我我,来班门弄斧:

function parse(obj, str){
  return new Function('obj', 'return obj.' + str.replace(/\.(\d+)/g, '\[$1\]'))(obj);
}
编辑于 2018-03-03 19:25:23 回复(0)
function parse(obj, str) {
   var strArr=str.replace('[', '.').replace(']', '').split('.');
   var i=0;
   while(i<strArr.length){
	  if(obj[strArr[i]]){
		  obj=obj[strArr[i]];
		  i++;
	  }else{
		  return 'undefined';
	  }
   }
   
   return obj;
}

发表于 2017-08-11 11:58:44 回复(0)
    const parse = (obj, str) => {
      const checkReg = /^[a-zA-Z0-9]+(\.[a-zA-Z0-9]+|\[[a-zA-Z0-9]+\])*$/g

      // 验证是否为键值对对象
      if (obj instanceof Object) {
        const [objType] = obj.constructor.toString().match(/\w+(?=\(\))/g)
        if (objType !== 'Object') {
          return '请输入数据源为对象'
        }
      } else {
        return '请输入数据源为对象'
      }

      // 验证索引字符串是否格式有效
      if (!checkReg.test(str)) {
        return '请输入有效格式'
      }

      // 检索并获取所对应值
      const [firstIndex] = str.match(/^[a-zA-Z0-9]+(?=[\.\[])/g)
      const childrenIndexsArr = str.match(/(?<=[\.\[])[a-zA-Z0-9]+/g)
      const indexsArr = childrenIndexsArr ? [firstIndex, ...childrenIndexsArr] : [firstIndex]
      let currentValue = obj // 储存目前节点值
      indexsArr.forEach(item => {
        if (currentValue[item]) {
          currentValue = currentValue[item]
        } else {
          return currentValue[item]
        }
      })

      return currentValue
    }

发表于 2019-11-08 10:25:58 回复(0)
function parse(obj,string){
var arr=string.split(".");
arr.forEach(function(item,index){
if(!isNaN(item)){
var temp=arr[index-1]+"["+item+"]";
arr.splice(index-1,2,temp);
}
});
return eval("obj."+arr.join(".")) || "undefined";
}
发表于 2017-09-06 22:02:03 回复(0)
 function parse(obj, str) {
    str.replace('[', '.').replace(']', '').split('.').map((ele) => obj = obj[ele.trim()]);
    return obj || 'undefined';
}
发表于 2017-07-25 15:58:27 回复(21)
function parse(obj,str){
   var arr=str.replace(/\[(\w)\]/g,'.$1').split('.'),i=0,tmp=obj;//把[]都替换成.的形式
   while(i<arr.length&&tmp){
      tmp=tmp[arr[i++]];
   }
   //console.log(tmp)
   return tmp!=undefined?tmp:'undefined';//注意undefined要返回字符串
}

编辑于 2017-07-24 11:06:36 回复(1)
function parse(obj, path) {
  const keys = path.split(/\[|\]|\./).filter(Boolean);
  let res = obj;
  for (const key of keys) {
    if (key in res) {
      res = res[key];
    } else {
      return 'undefined';
    }
  }
  return res;
}
发表于 2023-08-18 20:28:54 回复(0)
   let parse = function(obj,str){
      let reg = /([a-z])\.([0-9])/g;
      if(reg.test(str)){
        str.match(/([a-z])(\.)([0-9])/g);
        str = str.replace(reg,'$1[$2]')
      }
      str = 'object'+'.'+`${str}`;
      return eval(str)!=undefined?eval(str):'undefined'
   }
发表于 2022-09-20 16:30:54 回复(0)
function parse(obj,str){
     str = str.replace(/\[|\]/g,function($0){
          return  $0 == '\[' ? "." : ""
      })
      arr = str.split('.');
      res  = "obj";
      arr.map(function(item){
          res += `['${item}']`
      })

      return  eval(res);
  }



发表于 2021-07-29 06:33:09 回复(0)
lodash里的get。🤣。我这个细节肯定有不严谨的地方,就是数组的处理那。但我觉得用eval肯定没意思,而且都不建议用这个。用split获取参数是肯定的。至于取值我觉得用reduce也是个方式。只是我写的不行。希望有人看到后可以用这个思路完善下。
const parse = (obj, str, customValue) => {
        try {
          return (
            str.split(".").reduce((pre, cur) => {
              if (cur.includes("[") && cur.includes("]")) {
                const objParam = cur.split("[")[0];
                const arrParam = cur.split("[")[1].split("]")[0];
                return pre[objParam][arrParam];
              }
              return pre[cur];
            }, obj) || customValue
          );
        } catch (e) {
          return customValue || undefined;
        }
      };


发表于 2020-09-02 22:09:43 回复(0)
    function parse(obj, str) {
      let result=obj
      str=str.match(/\w/g)
      for(let i=0;i<str.length;i++){
        result=result[str[i]]
      }
      console.log(result)
      return result!=undefined?result:'undefined'
    }
发表于 2020-07-20 21:41:57 回复(0)
<script>
  var object = {
    b: { c: 4 }, d: [{ e: 5 }, { e: 6 }]
  };
  function parse(obj, path) {
    // b.c  split b c
    // d[0].e'  d.0.e  
    // 深拷贝
    var temp = JSON.parse(JSON.stringify(obj));
    let res = 'undefined';
    path = path.replace('[', '.').replace(']', '');
    //path 变成 b.c    d.0.e
    var dd = path.split('.')
    console.log(dd)
    dd.forEach(key => {
      console.log(key)  //key打印的就是 数组的元素
      temp = temp[key]  //这里的temp就是原来的数组,作为原来数组的key值,按照Key值查找元素
      console.log(temp)
  
    });
    return temp || res

  }
  console.log(parse(object, 'b.c') == 4) //true
  console.log(parse(object, 'd[0].e') == 5) //true
  console.log(parse(object, 'd.0.e') == 5) //true
  console.log(parse(object, 'd[1].e') == 6) //true
  console.log(parse(object, 'd.1.e') == 6) //true
  console.log(parse(object, 'f') == 'undefined') //true
</script>

发表于 2020-03-13 17:06:15 回复(0)
function parse(object,str){
    let arr = str.replace('[','.').replace(']','').split('.');
    if(arr.length === 0){
        return null;
    }
    let currAttr = object[arr[0]];
    if(!currAttr){
        return null;
    }
    for(let i=1;i<arr.length;i++){
        let key = arr[i];
        if(!currAttr[key]){
            return null;
        }
        currAttr = currAttr[key]
    }
    return currAttr
}
console.log(parse(object,str))

发表于 2020-03-09 23:52:59 回复(0)
function parse(obj,str){
            return eval("obj."+str);
    }
发表于 2019-09-20 17:36:45 回复(0)
function parse(obj, find) {
    find = find.replace(/\[(\w+)\]/g, '.$1').split('.');
    let cursor = 0,
        temp = JSON.parse(JSON.stringify(obj));
    while (cursor < find.length) {
        if (temp.constructor !== Object && !Array.isArray(temp)) {
            return 'undefined';
        }
        temp = temp[find[cursor]];
        cursor++;
    }
    temp = temp !== undefined ? temp : 'undefined';
    return temp;
}

发表于 2019-03-23 11:19:26 回复(0)
function parse(obj, str) {
var newStr = str.replace(/\[/g, ".").replace(/\]/g, "");
console.log(newStr);
var params = newStr.split(".");
var len = params.length;
console.log(params);
for(var i = 0; i < len; i++) {
obj = obj[params[i]];
}
return obj;
}

发表于 2019-03-19 15:16:21 回复(0)
function parse(obj, com) {     let comArr = com.split('.');     let ans = obj;     while(comArr.length!==0) {         let dir = comArr.shift();         try {          if (/\[\d+\]/.test(dir)) {                 let two = dir.match(/\d+/)[0];                 let one = dir.split('[')[0];              ans = obj[one];                 ans = ans[two];
                } else {              ans = ans[dir]    
                }    
            } catch {            return undefined
            }
       }     return ans;
}

发表于 2019-03-09 00:49:26 回复(0)
functionparse(obj,str){ //eval其实也不是那么百害而无一利
         return eval(obj.toString()+str);
}

发表于 2019-02-28 18:50:47 回复(0)
// 1、方括号换成点
// 2. 以点成数组
// 3、去空字符串
// 4、遍历key
// 5、取最后一个结果
// 6、注意undefined是字符串
function parse(obj, exp){
    return exp.replace(/\[|\]/g, '.').split('.').filter(x => x !== '').map(x => (obj = obj[x])).pop() || 'undefined'
}

编辑于 2019-02-27 18:23:06 回复(0)
var parse  = function(obj,keyStr){
    if(Object.prototype.toString.call(obj) !== '[object Object]') throw new Error('obj must be a plain object');
    if(Object.prototype.toString.call(keyStr) !== '[object String]') throw new Error('keyStr must be a string');
    var xStr = 'obj.'+keyStr;
    var result = eval(xStr);
    return result;
}
发表于 2019-02-03 11:02:49 回复(0)