告诉我,如何正确检查关联数组中是否存在键?
例如:
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
答案 0 :(得分: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))

答案 1 :(得分:1)
或者,您可以使用Lodash的.has()
方法。
然后,您只需要检查:
if (_.has(mydata, 'key2.subkey1.subkey1_1.value1')
mydata.key2.subkey1.subkey1_1.value1 = 'test';
答案 2 :(得分:0)
您应该使用in运算符:
"key" in obj // true, regardless of the actual value
或者,如果要特别测试对象实例的属性(而不是继承的属性),请使用hasOwnProperty:
obj.hasOwnProperty("key") // true
希望这会对你有所帮助。
来源:http://www.advancesharp.com/questions/628/checking-if-an-associative-array-key-exists-in-javascript
答案 3 :(得分:0)
为了尝试在嵌套结构中获取某些东西,我会做这样的事情:
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']));
当然,跟踪handledSoFar
中的搜索是可选的,但可能对开发/调试很有用。
答案 4 :(得分: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');
}
答案 5 :(得分: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);
答案 6 :(得分:0)
您提出的示例函数的问题:
safeSet(mydata.key2.subkey1.subkey1_1.value1, 'test');
或
is_undefined(mydata.key2.subkey1.subkey1_1.value1)
mydata.key2.subkey1 ...部分是否在调用函数之前运行。因此,如果其中一个子项不存在,则在到达代码之前将抛出异常。
你可以通过回调获得类似的东西......
safeSet(function(val) { mydata.key2.subkey1.subkey1_1.value1 = val; }, 'test')
然后,safeSet的实现将是:
var safeSet = function(setterFunc, val) {
try {
setterFunc(val);
} catch (e) {
if (e instanceof TypeError) {
return false;
} else {
throw e;
}
}
return true;
}
如果设置了值,safeSet返回true,否则返回false。