【问题标题】:Compare value within nested object比较嵌套对象中的值
【发布时间】:2018-10-06 12:19:51
【问题描述】:
所以我一直试图找到解决这个问题的方法,但没有成功。
const nameTest = 'testName';
const test = {
RANDOM_ONE: {
NAME: 'testName',
SOMETHING: {...}
},
RANDOM_TWO: {
NAME: 'Name',
SOMETHING: {...}
}
}
有什么简单的方法可以让我在不知道 RANDOM_X 是什么的情况下比较 nameTest 和 NAME 键以访问 NAME?
【问题讨论】:
标签:
javascript
object
compare
key
【解决方案1】:
您可以使用Object.keys() 来获取所有键的数组。然后循环遍历数组来检查属性:
const nameTest = 'testName';
const test = {
RANDOM_ONE: {
NAME: 'testName',
SOMETHING: {}
},
RANDOM_TWO: {
NAME: 'Name',
SOMETHING: {}
}
}
let testKeys = Object.keys(test);
testKeys.forEach(function(k){
console.log(test[k].NAME == nameTest);
});
【解决方案2】:
您可以在循环中使用 for ...:
for (let key in test) {
if (test[key].NAME === nameTest) {
// do something
}
}
【解决方案3】:
我希望我们知道测试的 2 个级别是您的目标。您可以编写一个函数来比较名称键。
function compare(obj, text){
for(let x in obj){
if(obj.x.name == text) return true;
else ;
}
}
然后用你的对象和字符串调用函数。
let a = compare(test, nameTest);
注意:这将比较对象以仅确定它是否包含 nameTest 字符串。
【解决方案4】:
var obj= test.filter(el){
if(el.NAME==nameTest)
{
return el;
}
}
var x= obj!=null?true:false;
【解决方案5】:
你可以使用find。
find 方法对每个索引执行一次回调函数
直到找到一个回调返回真值的数组。如果
找到这样的元素,find 立即返回该元素的值
元素。否则,find 返回 undefined。
所以它比使用forEach 循环整个对象更节省内存,因为如果回调函数找到值,find 会立即返回。打破 forEach 的循环是不可能的。在文档中:
没有其他方法可以停止或中断 forEach() 循环
抛出异常。如果你需要这样的行为,forEach() 方法
是错误的工具。
1.如果你想得到整个对象
var nameTest = 'testName';
var test = {
RANDOM_ONE: {
NAME: 'testName',
SOMETHING: {}
},
RANDOM_TWO: {
NAME: 'Name',
SOMETHING: {}
}
};
function getObjectByNameProperty(object, property) {
var objectKey = Object.keys(object)
.find(key => object[key].NAME === property);
return object[objectKey];
}
var object = getObjectByNameProperty(test, nameTest);
console.log(object);
2。如果您只想测试对象是否具有给定的名称值
var nameTest = 'testName';
var test = {
RANDOM_ONE: {
NAME: 'testName',
SOMETHING: {}
},
RANDOM_TWO: {
NAME: 'Name',
SOMETHING: {}
}
};
function doesObjectHaveGivenName(object, nameValue) {
var objectKey = Object.keys(object)
.find(key => object[key].NAME === nameValue);
return objectKey ? true : false;
}
console.log( doesObjectHaveGivenName(test, nameTest) );