Использование indexOf в совместном списке в реальном времени
Я пытаюсь изучить API Google Drive Realtime и у меня есть вопрос о CollaborativeList. Я новичок в JavaScript.
var mylist = model.createList();
mylist.push("apple");
mylist.push("orange");
mylist.push("banana");
mylist.push("grape");
var result = mylist.indexOf("grape");
и результат 3, что имеет смысл. Теперь, если я создам список, который состоит из объектов:
var mylist = model.createList();
var apple = {"color": "red","time": "0"};
mylist.push(apple);
var orange = {"color": "orange","time": "1"};
mylist.push(orange);
var banana = {"color": "yellow","time": "2"};
mylist.push(banana);
var grape = {"color": "purple","time": "3"};
mylist.push(grape);
var result = mylist.indexOf(grape);
Теперь результат -1. Должно быть что-то, чего я не понимаю. Что я делаю неправильно?
2 ответа
Изменение списка для совместной работы в реальном времени
Спасибо за ответы. Подвести итоги:
Похоже, что indexOf бесполезен для поиска объекта в совместном списке объектов в реальном времени. Мне нужно было изменить один объект в списке, и я подумал, что indexOf будет быстрым методом. Похоже, мне нужно преобразовать список Collaborative в массив javascript, пройти через массив, чтобы найти мой объект, получить индекс, а затем изменить объект в списке Collaborative.
window.gapi.load('drive-realtime', startdemo);
function startdemo() {
var i;
var index;
/* Create an in memory document for testing. */
var doc = gapi.drive.realtime.newInMemoryDocument();
var model = doc.getModel();
var mylist = model.createList();
mylist.clear();
var apple = {"type": "apple","identifier": "100"};
mylist.push(apple);
var orange = {"type": "orange","identifier": "101"};
mylist.push(orange);
var banana = {"type": "banana","identifier": "102"};
mylist.push(banana);
var grape = {"type": "grape","identifier": "103"};
mylist.push(grape);
/* Convert the collaborative list to a javascript array. */
var myarray = mylist.asArray();
/* Show what is in the array */
for ( i = 0; i < myarray.length; i++ )
{
console.log("Original List, i = " +i +", type = " +myarray[i].type +", identifier = " +myarray[i].identifier);
}
/* Find the index for our object. */
for ( i = 0; i < myarray.length; i++ )
{
if ( myarray[i].identifier === "103" )
{
index = i;
i = myarray.length;
}
}
console.log("index = " +index);
/* We will replace grape at identifier 103 with apricot. */
var apricot = {"type": "apricot","identifier": "103"};
mylist.set(index,apricot);
/* Get a new array to show the modification. */
myarray = mylist.asArray();
/* Now show what is in the list */
for ( i = 0; i < myarray.length; i++ )
{
console.log("Modified List, i = " +i +", type = " +myarray[i].type +", identifier = " +myarray[i].identifier);
}
}
<script type="text/javascript" src="https://apis.google.com/js/api.js"></script>
Изменение списка совместной работы Google в реальном времени
Спасибо за ответы. Подвести итоги:
Похоже, что indexOf бесполезен для поиска объекта в совместном списке объектов в реальном времени. Мне нужно было изменить один объект в списке, и я подумал, что indexOf будет быстрым методом. Похоже, мне нужно преобразовать список Collaborative в массив javascript, пройти через массив, чтобы найти мой объект, получить индекс, а затем изменить объект в списке Collaborative.
window.gapi.load('drive-realtime', startdemo);
function startdemo() {
var i;
var index;
/* Create an in memory document for testing. */
var doc = gapi.drive.realtime.newInMemoryDocument();
var model = doc.getModel();
var mylist = model.createList();
mylist.clear();
var apple = {"type": "apple","identifier": "100"};
mylist.push(apple);
var orange = {"type": "orange","identifier": "101"};
mylist.push(orange);
var banana = {"type": "banana","identifier": "102"};
mylist.push(banana);
var grape = {"type": "grape","identifier": "103"};
mylist.push(grape);
/* Convert the collaborative list to a javascript array. */
var myarray = mylist.asArray();
/* Show what is in the array */
for ( i = 0; i < myarray.length; i++ )
{
console.log("Original List, i = " +i +", type = " +myarray[i].type +", identifier = " +myarray[i].identifier);
}
/* Find the index for our object. */
for ( i = 0; i < myarray.length; i++ )
{
if ( myarray[i].identifier === "103" )
{
index = i;
i = myarray.length;
}
}
console.log("index = " +index);
/* We will replace grape at identifier 103 with apricot. */
var apricot = {"type": "apricot","identifier": "103"};
mylist.set(index,apricot);
/* Get a new array to show the modification. */
myarray = mylist.asArray();
/* Now show what is in the list */
for ( i = 0; i < myarray.length; i++ )
{
console.log("Modified List, i = " +i +", type = " +myarray[i].type +", identifier = " +myarray[i].identifier);
}
}
<script type="text/javascript" src="https://apis.google.com/js/api.js"></script>
Список для совместной работы не является идентичным Array#push
, Он копирует и переносит объект и не ссылается на него по ссылке.
Когда вы используете совместный список .indexOf()
как это mylist.indexOf(grape);
вы пытаетесь найти объект с той же ссылкой grape
, так как ничего не существует, он возвращает -1
,
пример
В этом примере мы помещаем объект в совместный список и в массив JS. Мы мутируем оригинальный объект, и console.log()
элемент из списка для совместной работы и из массива. Как вы можете видеть, объект из списка сотрудничества не изменился (копия), а объект в массиве изменился (ссылка).
window.gapi.load('drive-realtime', start);
function start() {
var doc = gapi.drive.realtime.newInMemoryDocument();
var model = doc.getModel();
var mylist = model.createList();
var myArray = [];
var apple = {
"color": "red",
"time": "0"
};
// push to Collaborative List
mylist.push(apple);
// puse to array
myArray.push(apple);
// mutate the original apple
apple.color = 'green';
console.log('origin: ', apple);
console.log('Collaborative List: ', mylist.get(0));
console.log('array: ', myArray[0]);
}
<script src="https://apis.google.com/js/api.js"></script>