복붙노트

[JQUERY] Access 개체 도트 표기법 문자열을 사용하여 자식 속성 [중복]

JQUERY

Access 개체 도트 표기법 문자열을 사용하여 자식 속성 [중복]

해결법


  1. 1.여기에 내가 얼마 전에 쓴 순진한 기능은, 그러나 그것은 기본적인 개체 속성에 대한 작동합니다 :

    여기에 내가 얼마 전에 쓴 순진한 기능은, 그러나 그것은 기본적인 개체 속성에 대한 작동합니다 :

    function getDescendantProp(obj, desc) {
        var arr = desc.split(".");
        while(arr.length && (obj = obj[arr.shift()]));
        return obj;
    }
    
    console.log(getDescendantProp(r, "b.b2"));
    //-> 99
    

    이 확장 답변을이 있지만 당신은 단지이 방법으로 점 표기법을 사용하여 숫자 인덱스를 지정할 수있는 정말 필요하지의 배열 인덱스 액세스를 "허용"

    getDescendantProp({ a: [ 1, 2, 3 ] }, 'a.2');
    //-> 3
    

  2. 2.분할과 initalValue로 오브젝트를 통과하면서 감소

    분할과 initalValue로 오브젝트를 통과하면서 감소

    VAR의 R = {A : 1, B : {B1 : 11 B2 99}}; VAR의 = "b.b2"; VAR s.split 값 = ( '.'). 감소 (함수 (a, b) { A [B]를 복귀; }, (R)); CONSOLE.LOG (값);

    최신 정보 (주석 덕분에 TeChn4K에 의해 게시)

    ES6 구문으로, 심지어는 짧은

    VAR의 R = {A : 1, B : {B1 : 11 B2 99}}; VAR의 = "b.b2"; VAR s.split 값 = ( '.')를 감소 ((a, b) => A [B], (R)).; CONSOLE.LOG (값);


  3. 3.당신은 lodash GET ()와 ()로 설정 방법을 사용할 수 있습니다.

    당신은 lodash GET ()와 ()로 설정 방법을 사용할 수 있습니다.

    얻기

    var object = { 'a': [{ 'b': { 'c': 3 } }] };
    
    _.get(object, 'a[0].b.c');
    // → 3
    

    환경

    var object = { 'a': [{ 'b': { 'c': 3 } }] };
    
    _.set(object, 'a[0].b.c', 4);
    console.log(object.a[0].b.c);
    // → 4
    

  4. 4.이 시나리오에서 가능하면 당신은 문자열로 당신이 eval () 함수를 사용할 수 있습니다 후있어 전체 배열 변수를 넣을 수있다.

    이 시나리오에서 가능하면 당신은 문자열로 당신이 eval () 함수를 사용할 수 있습니다 후있어 전체 배열 변수를 넣을 수있다.

    var r = { a:1, b: {b1:11, b2: 99}};
    var s = "r.b.b2";
    alert(eval(s)); // 99
    

    나는 사람들이 공포에 낚시를 느낄 수있다


  5. 5.존은 말하기의 대답 @ 확장, 나뿐만 아니라 세터 값을 추가했습니다. 에 plunkr을 확인

    존은 말하기의 대답 @ 확장, 나뿐만 아니라 세터 값을 추가했습니다. 에 plunkr을 확인

    http://plnkr.co/edit/lo0thC?p=preview

    function getSetDescendantProp(obj, desc, value) {
      var arr = desc ? desc.split(".") : [];
    
      while (arr.length && obj) {
        var comp = arr.shift();
        var match = new RegExp("(.+)\\[([0-9]*)\\]").exec(comp);
    
        // handle arrays
        if ((match !== null) && (match.length == 3)) {
          var arrayData = {
            arrName: match[1],
            arrIndex: match[2]
          };
          if (obj[arrayData.arrName] !== undefined) {
            if (typeof value !== 'undefined' && arr.length === 0) {
              obj[arrayData.arrName][arrayData.arrIndex] = value;
            }
            obj = obj[arrayData.arrName][arrayData.arrIndex];
          } else {
            obj = undefined;
          }
    
          continue;
        }
    
        // handle regular things
        if (typeof value !== 'undefined') {
          if (obj[comp] === undefined) {
            obj[comp] = {};
          }
    
          if (arr.length === 0) {
            obj[comp] = value;
          }
        }
    
        obj = obj[comp];
      }
    
      return obj;
    }
    

  6. 6.이것은 내가 할 수있는 가장 간단합니다 :

    이것은 내가 할 수있는 가장 간단합니다 :

    var accessProperties = function(object, string){
       var explodedString = string.split('.');
       for (i = 0, l = explodedString.length; i<l; i++){
          object = object[explodedString[i]];
       }
       return object;
    }
    var r = { a:1, b: {b1:11, b2: 99}};
    
    var s = "b.b2";
    var o = accessProperties(r, s);
    alert(o);//99
    

  7. 7.당신은 또한 할 수

    당신은 또한 할 수

    var s = "['b'].b2";
    var num = eval('r'+s);
    

  8. 8.나는 지원의 jQuery API 함수를 모르지만 나는이 기능을 가지고 :

    나는 지원의 jQuery API 함수를 모르지만 나는이 기능을 가지고 :

        var ret = data; // Your object
        var childexpr = "b.b2"; // Your expression
    
        if (childexpr != '') {
            var childs = childexpr.split('.');
            var i;
            for (i = 0; i < childs.length && ret != undefined; i++) {
                ret = ret[childs[i]];
            }
        }
    
        return ret;
    

  9. 9.나는 또한 배열을 처리 할 수 ​​있도록, 앤디 E의 답변을 확장했습니다 :

    나는 또한 배열을 처리 할 수 ​​있도록, 앤디 E의 답변을 확장했습니다 :

    function getDescendantProp(obj, desc) {
        var arr = desc.split(".");
    
        //while (arr.length && (obj = obj[arr.shift()]));
    
        while (arr.length && obj) {
            var comp = arr.shift();
            var match = new RegExp("(.+)\\[([0-9]*)\\]").exec(comp);
            if ((match !== null) && (match.length == 3)) {
                var arrayData = { arrName: match[1], arrIndex: match[2] };
                if (obj[arrayData.arrName] != undefined) {
                    obj = obj[arrayData.arrName][arrayData.arrIndex];
                } else {
                    obj = undefined;
                }
            } else {
                obj = obj[comp]
            }
        }
    
        return obj;
    }
    

    이 정규식을 할 수있는 더 효율적인 방법은 아마도,하지만 컴팩트입니다.

    이제 물건을 같이 할 수 있습니다 :

    var model = {
        "m1": {
            "Id": "22345",
            "People": [
                { "Name": "John", "Numbers": ["07263", "17236", "1223"] },
                { "Name": "Jenny", "Numbers": ["2", "3", "6"] },
                { "Name": "Bob", "Numbers": ["12", "3333", "4444"] }
             ]
        }
    }
    
    // Should give you "6"
    var x = getDescendantProp(model, "m1.People[1].Numbers[2]");
    

  10. 10.여기에 앤디 E의 코드의 확장 배열에 재귀하고 모든 값을 반환한다 :

    여기에 앤디 E의 코드의 확장 배열에 재귀하고 모든 값을 반환한다 :

    function GetDescendantProps(target, pathString) {
        var arr = pathString.split(".");
        while(arr.length && (target = target[arr.shift()])){
            if (arr.length && target.length && target.forEach) { // handle arrays
                var remainder = arr.join('.');
                var results = [];
                for (var i = 0; i < target.length; i++){
                    var x = this.GetDescendantProps(target[i], remainder);
                    if (x) results = results.concat(x);
                }
                return results;
            }
        }
        return (target) ? [target] : undefined; //single result, wrap in array for consistency
    }
    

    따라서이 목표를 부여 :

    var t = 
    {a:
        {b: [
                {'c':'x'},
                {'not me':'y'},
                {'c':'z'}
            ]
        }
    };
    

    우리는 얻을 :

    GetDescendantProps(t, "a.b.c") === ["x", "z"]; // true
    

  11. 11.앤디 E의 제이슨 더 많은, 그리고 내 자신의 솔루션에 대한 성능 테스트는 http://jsperf.com/propertyaccessor에서 사용할 수 있습니다. 수집 된 데이터에 추가 자신의 브라우저를 사용하여 테스트를 실행 주시기 바랍니다.

    앤디 E의 제이슨 더 많은, 그리고 내 자신의 솔루션에 대한 성능 테스트는 http://jsperf.com/propertyaccessor에서 사용할 수 있습니다. 수집 된 데이터에 추가 자신의 브라우저를 사용하여 테스트를 실행 주시기 바랍니다.

    예후는 앤디 E의 솔루션은 지금까지 가장 빠른 분명하다!

    관심있는 사람들을위한, 여기에 원래의 질문에 대한 내 솔루션에 대한 코드입니다.

    function propertyAccessor(object, keys, array) {
        /*
        Retrieve an object property with a dot notation string.
        @param  {Object}  object   Object to access.
        @param  {String}  keys     Property to access using 0 or more dots for notation.
        @param  {Object}  [array]  Optional array of non-dot notation strings to use instead of keys.
        @return  {*}
        */
        array = array || keys.split('.')
    
        if (array.length > 1) {
            // recurse by calling self
            return propertyAccessor(object[array.shift()], null, array)
        } else {
            return object[array]
        }
    }
    

  12. 12.짧은 답변 : 당신이 그것을 원하는처럼 아니, 네이티브 .access 기능이 없습니다. 제대로 언급 한 바와 같이, 당신은 그 부분을 통해 문자열과 루프 / 검사를 분할 자신의 함수를 정의해야합니다.

    짧은 답변 : 당신이 그것을 원하는처럼 아니, 네이티브 .access 기능이 없습니다. 제대로 언급 한 바와 같이, 당신은 그 부분을 통해 문자열과 루프 / 검사를 분할 자신의 함수를 정의해야합니다.

    물론, 당신은 항상 할 수있는 (심지어는 고려 나쁜 관행 경우) 평가를 사용하는 것입니다 ().

    처럼

    var s = 'b.b2';
    
    eval('r.' + s); // 99
    

  13. 13.다음은 앤디의 대답은 OBJ (문맥) 옵션입니다 제공하지 않을 경우이 창으로 다시 떨어질 @ 다음 조금 더 좋은 방법입니다 ..

    다음은 앤디의 대답은 OBJ (문맥) 옵션입니다 제공하지 않을 경우이 창으로 다시 떨어질 @ 다음 조금 더 좋은 방법입니다 ..

    function getDescendantProp(desc, obj) {
        obj = obj || window;
        var arr = desc.split(".");
        while (arr.length && (obj = obj[arr.shift()]));
        return obj;
    };
    
  14. from https://stackoverflow.com/questions/8051975/access-object-child-properties-using-a-dot-notation-string by cc-by-sa and MIT license