2016-10-10 6 views
1

Например,Как обновить массив объектов?

{ 
    id:"monday", 
    names:[ 
    {one:"white", two:"pink"}, 
    {uno:"blanco", dos:"rosado"} 
    ] 
} 

Как бы вы изменили white к black?
До сих пор, у меня есть это:

r.db.table.get('monday').update({ 
    names: r.row("names").nth(0) 
}) 

который определяет 0-й индекс names, но не уверен, как в дальнейшем указать one поле, а затем изменить его.

ответ

1

То, что вы до сих пор довольно корректно, но вы заменяете names своим первым под-объектом (я думаю, вы уже видели этот результат).

Вам просто нужно использовать merge изменить суб-объект, и changeAt на names поставить измененную суб-объект в массиве, так же, как это:

r.db.table.get('monday').update({ 
    names: r.row('names').changeAt(0, r.row('names').nth(0).merge({one: 'black'})) 
}) 

Надеется, что это помогает!

+0

Спасибо, что сработало. Но jeezuz, чтобы обновить одну мелочь, вы должны указать (в данном случае) «имена» 3 раза и 1-й индекс дважды .... это ..... wow – House3272

+0

Это действительно очень долго писать, но дело в том, это «общие» писания, и, прежде всего, это быстрый БД! ;) –

1

Возможно, ваши данные хранятся в объекте с именем obj; что-то вроде

var obj = {...} 

вы можете сделать эту работу:

obj.names[0].one = "black"; 

Я действительно пробовал не используя поджигатель никаких проблем. Каждый элемент массива независим, поэтому не стоит беспокоиться.

0

Прежде всего, вы должны использовать replace вместо update.

  1. Получить запись без names Поле.
  2. merge его новым names (удалить 1-й элемент из него, добавить в первой позиции нового элемента, в котором мы заменили white на black в one поле)

Что-то вроде этого:

r.db.table.get('monday').replace(function(doc){ 
     return doc.without({names: true}). merge({ 
     names: doc("names").deleteAt(0).prepend(doc("names").nth(0).merge({ 
      one : "black" 
     })) 
     }) 
    }) 
+0

Зачем «заменять» в пользу «обновления»? [Этот ответ] (https://stackoverflow.com/a/40071655/1543640) кажется более простым? – House3272

+1

@ House3272 yeh, я забыл про 'changeAt' = \ – Suvitruf

+0

Спасибо в любом случае! Btw, в вашем ответе, является '.get(). Get()' намеренно? – House3272