javascript - 查询 JavaScript 对象
问题描述
给定以下三个对象,返回包含键值对的第一个对象的有效方法是什么?
var obj = {
item1: {
name: 'apple',
color: 'red'
},
item2: {
name: 'blueberry',
color: 'blue'
},
item3: {
name: 'cherry',
color: 'red'
}
};
var obj2 = {
collection: [
{
item1: {
name: 'apple',
color: 'red'
},
item2: {
name: 'blueberry',
color: 'blue'
},
item3: {
name: 'cherry',
color: 'red'
}
}
]
};
var obj3 = {
items: [
{
item1: {
name: 'apple',
color: 'red'
}
},
{
item2: {
name: 'blueberry',
color: 'blue'
},
},
{
item3: {
name: 'cherry',
color: 'red'
}
}
]
};
我想为以下三个语句得到相同的结果:
getObject(obj, 'color', 'red');
getObject(obj2, 'color', 'red');
getObject(obj3, 'color', 'red');
输出:
{
name: 'apple',
color: 'red'
}
这是我到目前为止所拥有的,但我认为它在某处缺少一个闭包,因为它在函数调用自身时中断:
function getObject(arg, key, val) {
if (typeof arg!=='object') return null;
switch (Object.prototype.toString.call(arg)) {
case '[object Array]':
for (var i=0; i<arg.length; ++i) {
getObject(arg[i], key, val);
}
break;
case '[object Object]':
for (var i in arg) {
if (arg.hasOwnProperty(i)) {
if (typeof arg[i]==='object') {
getObject(arg[i], key, val);
} else {
if (i===key && arg[i]===val) {
return arg;
}
}
}
}
break;
}
}
解决方案
您可以使用此功能,它还将搜索更深层嵌套的数据结构。
function getObject(obj, prop, value) {
if (Object(obj) !== obj) return; // It is not an object
if (obj[prop] === value) return obj; // Found it
for (var key in obj) {
var result = getObject(obj[key], prop, value);
if (result) return result; // Found it
}
}
var obj = {item1: {name: 'apple',color: 'red'},item2: {name: 'blueberry',color: 'blue'},item3: {name: 'cherry',color: 'red'}};
var obj2 = {collection: [{item1: {name: 'apple',color: 'red'},item2: {name: 'blueberry',color: 'blue'},item3: {name: 'cherry',color: 'red'}}]};
var obj3 = {items: [{item1: {name: 'apple',color: 'red'}},{item2: {name: 'blueberry',color: 'blue'},},{item3: {name: 'cherry',color: 'red'}}]};
console.log(getObject(obj, 'color', 'red'));
console.log(getObject(obj2, 'color', 'red'));
console.log(getObject(obj3, 'color', 'red'));
推荐阅读
- java - MediaMetadataRetriever:尝试使用 url 从 mp3 检索专辑封面时应用程序崩溃
- android - 使用 retrofit2 发布 Soap XML 请求(不推荐使用简单 XML 框架)
- c# - SSIS:无法在 DontSaveSensitive 模式下使用 GetSensitiveValue() 访问脚本任务中的敏感参数
- postgresql - 函数返回具有动态列名的行集
- python - 了解对 NumPy 数组执行条件索引时出现的 DeprecationWarning 错误(版本 1.11.13,Python 2.7)
- sql - 将sql表列数据类型从smallmoney更改为money的影响
- django - Django:如何区分用户是从 social_auth 还是本地 Django 用户登录
- android - 在使用 layout_constrainedWidth 时,如何防止 ConstraintLayout 链中的 TextView 将其他 TextView 推到其约束之外?
- python - makefile won't compile in windows: 系统找不到指定的文件
- c - bsearch() 在 C 中的字符串数组上