Javascript - 按键检索值,包括嵌套对象
Javascript - retrive a value by key, including nested object
我正在尝试编写一个函数来按键检索值,包括在嵌套对象中进行搜索。
据我所知:
function getByKey (obj, key) {
if(obj.hasOwnProperty(key)){
return obj[key];
}else{
for(var prop in obj){
if(typeof prop == "object" && prop !== null){
if(prop.hasOwnProperty(key)){
return prop[key];
}else{
return iterate(prop, key);
}
}
}
}
}
如果有人准备好此功能并可以正常工作,或者可以修复我的功能,那就太好了。如果有人知道可以执行此操作的 Underscore 函数,那就太好了。
问题是您仅将对键的引用传递给迭代函数,但从未引用传递给它的原始对象。你需要使用obj[prop]
,如下:
function getByKey (obj, key)
{
if( obj.hasOwnProperty(key) )
{
return obj[key];
}
else
{
for(var prop in obj)
{
if( typeof obj[prop] == "object")
{
if(obj[prop].hasOwnProperty(key))
{
return obj[prop][key];
}
else
{
return getByKey(obj[prop], key);
}
}
}
}
};
尝试以下操作:https://jsfiddle.net/0yqu339t/4/
function getByKey(obj, key) {
if (obj.hasOwnProperty(key)) {
return obj[key];
} else {
for (var prop in obj) {
if (typeof(obj[prop]) === "object") {
return getByKey(obj[prop], key);
}
}
}
}
var o = {
a: 1,
b: {
c: 3,
d: 4,
e: {
f: 5,
g: 6
}
}
}
console.log(getByKey(o, 'f'));
console.log(getByKey(o, 'b'));
console.log(getByKey(o, 'd'));
对于递归你可以尝试(在 JQuery 的帮助下)
var haystack = $.map(obj, function(value, index) {
return [value];
});
var values = []; //or {} depending your situation
var getValues = function( needle, haystack, array ){
if( haystack[key]) !== 'undefined' ){
array.push(haystack[key]);
}else{
for( var i = 0; i < haystack.length; i++ ){
getValues( needle , haystack[i], array );
}
}
}
getValues( 'key', haystack, values );
console.log(values); //should be an array [ value1, value2, value3, value4, ... ]
//With all values that have this same searched key
希望对您有所帮助
您可以使用迭代和递归的方式来搜索对象的 属性。
function getByKey(obj, key) {
function iter(o) {
if (o !== null && typeof o === 'object') {
if (key in o) {
value = o[key];
return true;
}
return Object.keys(o).some(function (k) {
return iter(o[k]);
});
}
}
var value;
iter(obj);
return value;
}
var o = { a: 1, b: { c: 3, d: 4, e: { f: 5, g: 6 } } }
console.log(getByKey(o, 'f')); // 5
console.log(getByKey(o, 'b')); // { c: ... }
console.log(getByKey(o, 'd')); // 4
console.log(getByKey(o, 'q')); // undefined
.as-console-wrapper { max-height: 100% !important; top: 0; }
我正在尝试编写一个函数来按键检索值,包括在嵌套对象中进行搜索。
据我所知:
function getByKey (obj, key) {
if(obj.hasOwnProperty(key)){
return obj[key];
}else{
for(var prop in obj){
if(typeof prop == "object" && prop !== null){
if(prop.hasOwnProperty(key)){
return prop[key];
}else{
return iterate(prop, key);
}
}
}
}
}
如果有人准备好此功能并可以正常工作,或者可以修复我的功能,那就太好了。如果有人知道可以执行此操作的 Underscore 函数,那就太好了。
问题是您仅将对键的引用传递给迭代函数,但从未引用传递给它的原始对象。你需要使用obj[prop]
,如下:
function getByKey (obj, key)
{
if( obj.hasOwnProperty(key) )
{
return obj[key];
}
else
{
for(var prop in obj)
{
if( typeof obj[prop] == "object")
{
if(obj[prop].hasOwnProperty(key))
{
return obj[prop][key];
}
else
{
return getByKey(obj[prop], key);
}
}
}
}
};
尝试以下操作:https://jsfiddle.net/0yqu339t/4/
function getByKey(obj, key) {
if (obj.hasOwnProperty(key)) {
return obj[key];
} else {
for (var prop in obj) {
if (typeof(obj[prop]) === "object") {
return getByKey(obj[prop], key);
}
}
}
}
var o = {
a: 1,
b: {
c: 3,
d: 4,
e: {
f: 5,
g: 6
}
}
}
console.log(getByKey(o, 'f'));
console.log(getByKey(o, 'b'));
console.log(getByKey(o, 'd'));
对于递归你可以尝试(在 JQuery 的帮助下)
var haystack = $.map(obj, function(value, index) {
return [value];
});
var values = []; //or {} depending your situation
var getValues = function( needle, haystack, array ){
if( haystack[key]) !== 'undefined' ){
array.push(haystack[key]);
}else{
for( var i = 0; i < haystack.length; i++ ){
getValues( needle , haystack[i], array );
}
}
}
getValues( 'key', haystack, values );
console.log(values); //should be an array [ value1, value2, value3, value4, ... ]
//With all values that have this same searched key
希望对您有所帮助
您可以使用迭代和递归的方式来搜索对象的 属性。
function getByKey(obj, key) {
function iter(o) {
if (o !== null && typeof o === 'object') {
if (key in o) {
value = o[key];
return true;
}
return Object.keys(o).some(function (k) {
return iter(o[k]);
});
}
}
var value;
iter(obj);
return value;
}
var o = { a: 1, b: { c: 3, d: 4, e: { f: 5, g: 6 } } }
console.log(getByKey(o, 'f')); // 5
console.log(getByKey(o, 'b')); // { c: ... }
console.log(getByKey(o, 'd')); // 4
console.log(getByKey(o, 'q')); // undefined
.as-console-wrapper { max-height: 100% !important; top: 0; }