-1

Google Drive Realtime Api を学習しようとしていますが、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 になりました。わからないことがあるはずです。私は何を間違っていますか?

4

2 に答える 2

0

共同リストはと同一ではありません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>

于 2016-12-13T20:53:42.453 に答える
0

リアルタイム共同リストの変更

回答ありがとうございます。要約する:

オブジェクトの Realtime Collaborative List でオブジェクトを検索する場合、indexOf は役に立たないようです。リスト内の 1 つのオブジェクトを変更する必要があり、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 リアルタイム コラボレーション リストの変更

回答ありがとうございます。要約する:

オブジェクトの Realtime Collaborative List でオブジェクトを検索する場合、indexOf は役に立たないようです。リスト内の 1 つのオブジェクトを変更する必要があり、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>
于 2016-12-14T22:32:38.773 に答える