我有一个如下所述的ArrayCollection。
private var initDG:ArrayCollection = new ArrayCollection([
{fact: "Order #2314", appName: "AA"},
{fact: "Order #2315", appName: "BB"}
{fact: "Order #2316", appName: "BB"}
...
{fact: "Order #2320", appName: "CC"}
{fact: "Order #2321", appName: "CC"}
]);
我想在ArrayCollection initDG 中使用 UNIQUE VALUES 的“appName”字段填充ComboBox。
<mx:ComboBox id="appCombo" dataProvider="{initDG}" labelField="appName"/>
我能想到的一种方法是遍历Array对象,并为每个对象检查并将唯一的appName条目推送到另一个Array中。有没有更好的解决方案?
答案 0 :(得分:3)
这对我来说听起来不错:
var unique:Object = {};
var value:String;
var array:Array = initDG.toArray();
var result:Array = [];
var i:int = 0;
var n:int = array.length;
for (i; i < n; i++)
{
value = array[i].appName;
if (!unique[value])
{
unique[value] = true;
result.push(value);
}
}
return new ArrayCollection(result);
答案 1 :(得分:1)
您可以使用此类查找唯一的arraycollection:
tempArray=_uniqueArray.applyUnqiueKey1(_normalsearchdata.toArray());
“uniqueArray”这是包名,_normalsearchdata是ArrayCollection;
package{
import mx.collections.ArrayCollection;
public class applyUniqueKey{
private var tempArray:Array;
private var tempIndex = 0;
public var temp:String;
public function applyUnqiueKey1(myArray)
{
tempArray = new Array();
tempIndex = 0;
myArray.sort();
tempArray[0] = myArray[0];
tempIndex++;
for(var i=1; i<myArray.length; i++) {
if(myArray[i] != myArray[i-1]) {
tempArray[tempIndex] = myArray[i];
tempIndex++;
}
}
var temp=String(tempArray.join());
return new ArrayCollection(tempArray);
}
}
}
答案 2 :(得分:0)
唉,ActionScript的数组中没有unique()方法,但你可以像这样对它进行近似:
var names:Array = initDG.toArray().map(
function (e:Object, i:Number, a:Array):String {
return e.appName;
}
);
var uniqueNames:Array = names.filter(
function (name:String, i:Number, a:Array):Boolean {
// Only returns true for the first instance.
return names.indexOf(name) == i;
}
);
请注意,这恰好起作用,因为您正在过滤字符串,这些字符串按值进行比较。如果您需要过滤任意对象,这将无效。