2017-11-16 20 views
0

私はアカウントオブジェクトのリストを含む変数を持っており、それらのアカウントのすべてのフィールドを繰り返し処理したいと思います。Javascriptに相当するApex For

私は以下のコードを使ってjavascriptでこれを達成することができますが、私がする必要がなければ頂点から外したくありません。

頂点にはJavaScriptの "IN"と同等の機能があります。これは、次のレコードのすべてのフィールドを同じフィールドに比較することができますか?

for (var key in dataGet.accounts[i]) { 
    if (dataGet.accounts[i][key] != dataGet.accounts[i+1][key]) { 
    dataGet.accounts[i][key] = dataGet.accounts[i+1][key]; 
    } 
} 

ありがとう!あなたは2つのオブジェクトのすべてのフィールドを比較するにはaccounts[i].getPopulatedFieldsAsMap()

を使用することができますアクセスのキー=>値の一種として、一つのレコードに移入すべてのフィールドを取得するには

答えて

0

(彼らは人口だかどうか)あなたがアップに読んでください「Dynamic Apex」および「describe」操作

Map<String, Schema.SObjectField> fieldsMap = Schema.SObjectType.Account.fields.getMap(); 

そして、あなたはのsObjectsで動作しますが、一部でない場合、あなたはマップキー

for(String field : fieldsMap.keyset()){ 
    System.debug(field + ': ' + accounts[i].get(field)); 
} 

に繰り返すことができます。このような何かはあなたのオブジェクトのすべてのAPI名を取得しますあなたが制御できないクラス(つまり、内部実装を変更してMap<String, String>を使用してキーと値のペアなどを格納するだけでは意味がありません)。これはうまくいく可能性があります。アペックスには反射がありません。

public with sharing class Stack47339633{ 
    public String name, some, other, property; 
    public Integer someInt; 
    public Date d; 
} 

Stack47339633 obj1 = new Stack47339633(); 
obj1.name = 'hello'; 
obj1.some = 'world'; 
obj1.someInt = 13; 
obj1.d = System.today(); 

Stack47339633 obj2 = new Stack47339633(); 
obj2.name = 'hello'; 
obj2.some = 'stackoverflow'; 
obj2.someInt = -7; 
obj2.d = System.today(); 

// Let's treat them as JSON objects... 
Map<String, Object> o1 = (Map<String,Object>) JSON.deserializeUntyped(JSON.serialize(obj1)); 
Map<String, Object> o2 = (Map<String,Object>) JSON.deserializeUntyped(JSON.serialize(obj2)); 
Map<String, Object> o3 = new Map<String, Object>(); 

// ...compare, write identical fields to result object 
for(String s : o1.keyset()){ 
    System.debug(s + ':' + o1.get(s) + ' == ' + o2.get(s) + '?'); 
    if(o1.get(s) == o2.get(s)){ 
     System.debug('match!'); 
     o3.put(s, o1.get(s)); 
    } 
} 

// and cast that result object back to real class instance 
Stack47339633 obj3 = (Stack47339633) JSON.deserialize(JSON.serialize(o3), Stack47339633.class); 
System.debug('Full result: ' + obj3); 
System.debug('Name : ' + obj3.name); 
System.debug('someint : ' + obj3.someInt); 
System.debug('d : ' + obj3.d); 

これはJSONに戻って戻ってきますが、完成していますが、それは完了です。 シリアライゼーションが失敗する場合があります(例えば、thisの参照を保持しています)。transientとマークされていると生き残れないかもしれませんが、もっと良い選択肢はないと思います。また、これらの

チェック:

+0

ありがとう! これらのオブジェクトの文字列を設定する方法がわかりません。 これは、アカウントオブジェクトではなく、文字列属性を持つカスタム外部クラスです。したがって、dataGetはクラスになり、名前は文字列になります。 EX:if(accts [i] .get(field)= 3 {accts [i + 1] .get(field)= 'NUM3'}。エラーは、私が理解している表現を設定できないということです。そのフィールドをdataGet.nameを表す方法でどのように参照するのですか? –

関連する問題