顶点相当于 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
它可能无法生存......但我认为你没有更好的选择.
还要检查这些:
我有一个包含帐户对象列表的变量,我想遍历这些帐户的所有字段。
我可以通过 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
它可能无法生存......但我认为你没有更好的选择.
还要检查这些: