2014-04-18 4 views
0

Я строю собственный NodeJS C++ модуль на основе V8. Я получил следующий код в цикле:V8, добавить текст к последнему элементу массива

Local<Array> nodes = Array::New(); 

/********** INSIDE THE LOOP ************/ 
Local<Object> node_obj = Object::New(); 
node_obj->Set(data_symbol, String::New(input.substr(openPos + (lastTag > 1 ? 3 : 2), pos - openPos - (lastTag > 1 ? 3 : 2) - 1).c_str())); 
node_obj->Set(tag_symbol, Integer::New(lastTag)); 
nodes->Set(id, node_obj); 

И я населяющих массив объектов, поэтому выходной (в JS) будет выглядеть следующим образом:

[ 
    {tag: 2, data: "asdsadsadasfddgdfgdfg"}, 
    {tag: 1, data: "afg235235232fgdfg"} 
] 

Мои вопросы, как я могу добавить строку в data_symbol последнего объекта массива?

Полный код можно найти здесь: http://pastebin.com/tCgWCxyA

Пример того, что я пытаюсь сделать:

Давайте эту структуру, например:

struct Node { 
    short tag; 
    std::string data; 

    Node(const std::string& input, short tagId) : tag(tagId), data(input) {} 
}; 

std::vector<Node> elems; 

Мой вопрос заключается в том Я могу сделать

elems.back().data.append("SomeString"); 

в V8?

+0

Append как? Можете ли вы привести пример? – mscdex

+0

@mscdex Я отредактировал мой вопрос – Deepsy

ответ

1

Вы можете использовать String::Concat(Handle<String> left, Handle<String>right) так:

HandleScope scope; 

Local<Object> lastnode = nodes->Get(nodes->Length() - 1)->ToObject(); 
Local<String> lastdatastr = lastnode->Get(data_symbol)->ToString(); 
lastnode->Set(data_symbol, 
       String::Concat(lastdatastr, String::New(" I'm appended!"))); 
+0

Дело в том, что после завершения цикла мне нужно добавить его, и я не знаю значения datastr. Что-то вроде 'elems.back(). Data.append (" SomeString ");' – Deepsy

+1

Я обновил код. – mscdex

+0

Спасибо! Это то что мне нужно! Еще один вопрос. Если этот код находится в цикле, это вызовет дополнительные накладные расходы и станет ли это узким местом мой код? Я говорю о петле с итерациями 100k +. – Deepsy

Смежные вопросы