顶点相当于 Javascript For In

Apex equivalent to Javascript For In

我有一个包含帐户对象列表的变量,我想遍历这些帐户的所有字段。

我可以通过 javascript 使用下面的代码来完成此操作,但如果不需要,我不想从 apex 中取出东西。

apex 是否有等同于 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];
     }
}

谢谢!

要将所有字段填充到一个记录中作为键 => 值类型的访问,您可以使用 accounts[i].getPopulatedFieldsAsMap()

要比较 2 个对象的所有字段(无论是否填充),您应该阅读 "Dynamic Apex" 和“describe”操作。这样的事情会让你在对象上得到所有 API 个名字:

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

然后你可以迭代映射键

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

如果您不使用 sObjects,而是使用一些您无法控制的 类(这意味着您不能仅更改内部实现以使用 Map<String, String> 来存储键值对或其他东西)......这可能有效。 Apex 没有反射。

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 = 'Whosebug';
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 它可能无法生存......但我认为你没有更好的选择.

还要检查这些: