0

ドキュメントに複数値フィールドがあり、値に基づいて値を削除したいと思います。

私はこれを思いついた:

var doc:NotesDocument = rowData.getDocument();
var item:NotesItem = doc.getFirstItem("ValidProjects");
var a:Array = item.getValues()

for (var v in a)
dBar.info("Before removed V=" + v );

removeFromArray(a,compositeData.ProjectID);
doc.replaceItemValue("ValidProjects",a );

for (var v in a)
dBar.info("After removed V=" + v);


doc.save();


function removeFromArray(arr, val) {
for(var i=0; i<arr.length; i++) {
    dBar.info("Value = " + arr[i] + " Remove = " + val);
    if(arr[i] == val) {
        dBar.info("Removing " + i)
        arr.splice(i, 1);
        break;
    }
   }
}

removeFromArrayが正常に呼び出され、期待どおりにデバッグバーに「Removing 0」メッセージが表示されますが、配列はまったく変更されず、値は削除されません。何か案は?

4

2 に答える 2

3

ItemValuesをVectorとして扱います。

function removeFromItemValues(java.util.Vector vector, val) {
      // see http://docs.oracle.com/javase/6/docs/api/java
      vector.remove(val);
      return vector; //Optional
}

お役に立てば幸い

于 2012-12-22T01:13:55.373 に答える
1

簡単なショット...引数が「参照によって」渡されるかどうかはわかりません...?

そうでない場合は、それが理由です。私は通常、代わりに関数を使用して値を返すことを好みます。プログラミングの観点から、コードが何をするのかを読む方がより明確だと思います。この特定の例では、コードを次のように変更します。

  function removeFromArray(arr, val) {
    for(var i=0; i<arr.length; i++) {
        dBar.info("Value = " + arr[i] + " Remove = " + val);
        if(arr[i] == val) {
            dBar.info("Removing " + i)
            arr.splice(i, 1);
            break;
        }
       }
       return arr;
    }

そして、あなたはそれを次のように呼ぶでしょう:

a = removeFromArray(a,compositeData.ProjectID);

「After...」メッセージに変化が見られるかどうかは書きませんか?-または、値が変更されていないことをドキュメントで確認できますか?

よろしくお願いします

/ジョン

于 2012-12-21T17:41:58.983 に答える