2017-04-10 1 views
2

연관 배열에서 키가 얼마나 정확하게 존재하는지 확인하겠습니다. 예를 들어연관 배열에서 키의 존재를 확인하십시오.

:

var mydata = { 
    key1: '', 
    key2: { 
     subkey1: { 
      subkey1_1: { 
       value1: '' 
       value2" '', 
      }, 
     }, 
     subkey2: ''; 
    }, 
} 

if ((mydata.key2 != undefined) && (mydata.key2.subkey1 != undefined) && (mydata.key2.subkey1.subkey1_1 != undefined)) 
    mydata.key2.subkey1.subkey1_1.value1 = 'test'; 

너무 길고 복잡

((mydata.key2 != undefined) && (mydata.key2.subkey1 != undefined) && (mydata.key2.subkey1.subkey1_1 != undefined)) 

내가

safeSet(mydata.key2.subkey1.subkey1_1.value1, 'test'); 

또는

if (is_undefined(mydata.key2.subkey1.subkey1_1.value1) == true) 
    mydata.key2.subkey1.subkey1_1.value1 = 'test'; // now - error if 'mydata.key2.subkey1.subkey1_1' not exist 
처럼 단순한 기능을 사용하고 싶습니다

"key" in obj // true, regardless of the actual value 

을 또는, 당신은 객체 인스턴스의 속성 (및 상속되지 속성)에 특히 테스트하려는 경우,이 것 hasOwnProperty:

obj.hasOwnProperty("key") // true 

희망을 사용 :

+3

'연관 배열'? –

+0

키가 있는지 또는 키 값이 있는지 확인 하시겠습니까? 당신의 질문은 전자를 말하고 당신의 코드는 후자를 의미합니다. 어느 쪽이든,'try/catch' 블록을 사용할 수있는 것처럼 들린다. –

답변

2

당신은 중첩 된 속성이 존재하는 경우 테스트 reduce()를 사용하여 사용자 정의 함수를 만들 수 있습니다. 키를 문자열로 전달할 수 있습니다. 나는 이런 식으로 뭔가 할 줄 중첩 된 구조에서 뭔가를 얻으려고 들어

var mydata = { 
 
    key1: '', 
 
    key2: { 
 
    subkey1: { 
 
     subkey1_1: { 
 
     value1: '', 
 
     value2: '', 
 
     }, 
 
    }, 
 
    subkey2: '' 
 
    }, 
 
} 
 

 
function safeSet(key, data) { 
 
    return key.split('.').reduce(function(r, e) { 
 
    return r ? r[e] : undefined; 
 
    }, data) != undefined 
 
} 
 

 
console.log(safeSet('key2.subkey1.subkey1_1.value1', mydata))

0

: handledSoFar에서 검색

function getPath(element, path) { 
    var handledSoFar = []; 
    for (var i = 0; i < path.length; i++) { 
     var property = path[i]; 
     handledSoFar.push(property); 
     if (typeof element[property] === 'undefined') { 
      throw new Error('Path ' + handledSoFar.join('->') + ' is undefined'); 
     } 
     element = object[property]; 
    } 
    return element; 
} 

var mydata = { 
    key1: '', 
    key2: { 
     subkey1: { 
      subkey1_1: { 
       value1: '', 
       value2: 'hi' 
      } 
     }, 
     subkey2: '' 
    } 
}; 

// Prints 'hi' 
console.log(getPath(mydata, ['key2', 'subkey1', 'subkey1_1', 'value2'])); 

// Throws error 'Path key2->subkey2->subkey1_1 is undefined' 
console.log(getPath(mydata, ['key2', 'subkey1', 'subkey1_1', 'value2'])); 

물론 유지 트랙은 선택 사항이지만 수도 개발/디버깅에 유용합니다.

1

.has() 방법을 Lodash으로 만들 수 있습니다. 다음, 당신은 단지 확인해야합니다 :

if (_.has(mydata, 'key2.subkey1.subkey1_1.value1') 
    mydata.key2.subkey1.subkey1_1.value1 = 'test'; 
0

당신은 또한 lodash 깊은 필드 선택 사용할 수 있습니다 lodash.get (documentation) 당신은 경로를 분할 할 수

const get = require('lodash.get'); 
const set = require('lodash.set'); 

if (!get(mydata, 'key2.subkey1.subkey1_1.value1')) { 
    set(mydata, 'key2.subkey1.subkey1_1.value1', 'test'); 
} 
0

및 확인을 다음과 같은 경우 요소가 존재합니다. 새 속성에 개체를 할당하지 않은 경우

속성 값을 반환하십시오.

마지막에 값을 할당하십시오.

function setValue(object, path, value) { 
 
    var fullPath = path.split('.'), 
 
     way = fullPath.slice(), 
 
     last = way.pop(); 
 

 
    way.reduce(function (r, a) { 
 
     return r[a] = r[a] || {}; 
 
    }, object)[last] = value; 
 
} 
 

 
var object = { key1: '', key2: { subkey1: { subkey1_1: { value1: '', value2: '' } }, subkey2: '' } }; 
 

 
setValue(object, 'key2.subkey1.subkey1_1.value1', 'test'); 
 
console.log(object);

0

당신이 제시 한 예 기능의 문제 :

safeSet(mydata.key2.subkey1.subkey1_1.value1, 'test'); 

또는

is_undefined(mydata.key2.subkey1.subkey1_1.value1) 

사용자가 다음과 같은 mydata.key2.subkey1 ... 부분이 전에전에 실행됩니다.함수가 호출됩니다. 따라서 하위 키 중 하나가 없으면 코드에 도달하기 전에 예외가 throw됩니다.

safeSet의 구현은 다음이 될 것

safeSet(function(val) { mydata.key2.subkey1.subkey1_1.value1 = val; }, 'test') 

당신은 비록 콜백을 사용하여 비슷한 얻을 수

... :

var safeSet = function(setterFunc, val) { 
    try { 
    setterFunc(val); 
    } catch (e) { 
    if (e instanceof TypeError) { 
     return false; 
    } else { 
     throw e; 
    } 
    } 
    return true; 
} 

safeSet이 값이 설정된 경우 true를 반환하고, 그렇지 않은 경우는 false .

관련 문제