[JQUERY] Access 개체 도트 표기법 문자열을 사용하여 자식 속성 [중복]
JQUERYAccess 개체 도트 표기법 문자열을 사용하여 자식 속성 [중복]
해결법
-
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.분할과 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.당신은 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.이 시나리오에서 가능하면 당신은 문자열로 당신이 eval () 함수를 사용할 수 있습니다 후있어 전체 배열 변수를 넣을 수있다.
이 시나리오에서 가능하면 당신은 문자열로 당신이 eval () 함수를 사용할 수 있습니다 후있어 전체 배열 변수를 넣을 수있다.
var r = { a:1, b: {b1:11, b2: 99}}; var s = "r.b.b2"; alert(eval(s)); // 99
나는 사람들이 공포에 낚시를 느낄 수있다
-
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.이것은 내가 할 수있는 가장 간단합니다 :
이것은 내가 할 수있는 가장 간단합니다 :
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.당신은 또한 할 수
당신은 또한 할 수
var s = "['b'].b2"; var num = eval('r'+s);
-
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.나는 또한 배열을 처리 할 수 있도록, 앤디 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.여기에 앤디 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.앤디 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.짧은 답변 : 당신이 그것을 원하는처럼 아니, 네이티브 .access 기능이 없습니다. 제대로 언급 한 바와 같이, 당신은 그 부분을 통해 문자열과 루프 / 검사를 분할 자신의 함수를 정의해야합니다.
짧은 답변 : 당신이 그것을 원하는처럼 아니, 네이티브 .access 기능이 없습니다. 제대로 언급 한 바와 같이, 당신은 그 부분을 통해 문자열과 루프 / 검사를 분할 자신의 함수를 정의해야합니다.
물론, 당신은 항상 할 수있는 (심지어는 고려 나쁜 관행 경우) 평가를 사용하는 것입니다 ().
처럼
var s = 'b.b2'; eval('r.' + s); // 99
-
13.다음은 앤디의 대답은 OBJ (문맥) 옵션입니다 제공하지 않을 경우이 창으로 다시 떨어질 @ 다음 조금 더 좋은 방법입니다 ..
다음은 앤디의 대답은 OBJ (문맥) 옵션입니다 제공하지 않을 경우이 창으로 다시 떨어질 @ 다음 조금 더 좋은 방법입니다 ..
function getDescendantProp(desc, obj) { obj = obj || window; var arr = desc.split("."); while (arr.length && (obj = obj[arr.shift()])); return obj; };
from https://stackoverflow.com/questions/8051975/access-object-child-properties-using-a-dot-notation-string by cc-by-sa and MIT license
'JQUERY' 카테고리의 다른 글
[JQUERY] 크롬에서 옵션을 선택 요소에 이벤트를 클릭 (0) | 2020.10.03 |
---|---|
[JQUERY] 정렬 배열 요소 (숫자 문자열), 자연 종류 (0) | 2020.10.03 |
[JQUERY] 액세스 제어 요청 헤더, jQuery로 AJAX 요청의 헤더에 추가한다 (0) | 2020.10.03 |
[JQUERY] 어떻게 jQuery를 사용하여 키보드의 Enter 키를 눌러 감지? (0) | 2020.10.03 |
[JQUERY] ASP.NET MVC에 jQuery를 사용하여 부분 뷰를 렌더링 (0) | 2020.10.03 |