Что-то вроде этого должно работать:
var testObj = {
test: 'testValue',
test1: 'testValue1',
test2: {
test2a: 'testValue',
test2b: 'testValue1'
}
}
function searchObj (obj, query) {
for (var key in obj) {
var value = obj[key];
if (typeof value === 'object') {
searchObj(value, query);
}
if (value === query) {
console.log('property=' + key + ' value=' + value);
}
}
}
Если вы выполните searchObj(testObj, 'testValue');
, он будет записывать на консоль следующее:
property=test value=testValue
property=test2a value=testValue
Очевидно, вы можете заменить console.log
с тем, что вы хотите, или добавьте параметр обратного вызова в функцию searchObj
, чтобы сделать его более многоразовым.
EDIT: добавлен параметр query
, который позволяет вам указать желаемое значение для поиска, когда вы вызываете функцию.
Пространство имен, объявленное в атрибуте proc_macro_derive
, полностью игнорируется , и это известная ошибка . Из-за этой ошибки следующий код может быть скомпилирован, хотя это не должно быть.
#[derive(Example)]
#[attr] // Works (but shouldn't)
struct Demo {
#[lolwut::attr] // Works (but shouldn't)
field: i32,
}
До тех пор, пока ошибка не будет устранена, вы должны продолжать использовать форму без пространства имен (example_attr
).
Кроме того, согласно этому отчету об ошибках, начиная с Rust 1.33.0, нет способа добиться того, что OP хочет через proc-macros, и как разрешить #[example::attr]
работать все еще в разработке.