如何迭代对象中的属性

How do I iterate over properties in an Object

本文关键字:对象 属性 迭代 何迭代      更新时间:2023-10-16

我想遍历V8 C++函数中的对象。

NodeJS:

node.addProperties({"user":"testuser","password":"passwd"};

我想把"user"answers"password"这两个名称和值传递给一个C++方法,该方法接受以下参数:

AddProperty(char * name, char * value);

名称/值对的数量可能不同,所以我需要一个通用的解决方案。

我能得到一些帮助,让我走上正轨吗。

我一直在为Node&V8,但我只是没有这个的想法了:)

假设v8足够新(io.js或node0.12),其中the_object是从js 传递的对象

Local<Array> property_names = the_object->GetOwnPropertyNames();
for (int i = 0; i < property_names->Length(); ++i) {
    Local<Value> key = property_names->Get(i);
    Local<Value> value = the_object->Get(key);
    if (key->IsString() && value->IsString()) {
        String::Utf8Value utf8_key(key);
        String::Utf8Value utf8_value(value);
        AddProperty(*utf8_key, *utf8_value);
    } else {
        // Throw an error or something
    }
}

由于我刚刚为我的宝石做了这件事,我可能会对@Esailija的这个答案添加一些细微的更改,现在已经被弃用:

if (value->IsObject()) {
    Local<Context> context = Context::New(isolate);
    Local<Object> object = value->ToObject();
    MaybeLocal<Array> maybe_props = object->GetOwnPropertyNames(context);
    if (!maybe_props.IsEmpty()) {
        Local<Array> props = maybe_props.ToLocalChecked();
        for(uint32_t i=0; i < props->Length(); i++) {
           Local<Value> key = props->Get(i);
           Local<Value> value = object->Get(key);
           // do stuff with key / value
        }
    }
 }

主要的补充是

  • 你必须有一个上下文来获取属性名称,旧的方法正在被弃用
  • 将值转换为对象时需要小心

这现在可以工作,但一如既往地确保检查v8.h以获得最新的非弃用方式。