Operator Type:
Operator Scope of Action:
Operator Purpose:
Operator First Added:
Operator Altered:
Function [other Function type actions]
Item [operators of similar scope]
Data manipulation [other Data manipulation operators]
Baseline
List.unique()
This returns a List of the unique values in the list, as a sorted but de-duped list. Hitherto, de-duping required passing data into a Set-type attribute and back. Trailing parentheses are optional for this function.
If $MyList is 'bee;ant;cow;bee':
$MyList = $MyList.unique;
gives 'ant;bee;cow'. Be aware that this function results in a case insensitive A-Z sort, thus not 'bee;ant;cow' as might otherwise be assumed (to get such an outcome see further below).
The function can be chained with .sort-type actions and .reverse.
$MyList = $MyList("Another note").unique;
$SomeList = collect(children, $MyNumberList).unique.nsort;
$MyList = collect(children, $MyList).unique.reverse;
The last above sets $MyList to a list of all the unique, discrete, values to be found in $MyList in every child of the current note. Use with collect() or collect_if() to act on a particular attribute across a group of notes. If a collect() with query scope is the designator 'all' the result will be every discrete value for the referenced list attribute across the whole document.
This function does not apply to Set-type lists because Sets automatically de-duplicate items so are always a list of unique values.
De-duping a list whilst retaining original sort order
The basic method is this:
$MyList.each(anItem){
if(!$MyList2.contains(anItem)){
$MyList2+=anItem;
}
};
If is it desired to de-dupe $MyList back to itself, use a list-type variable:
var:list vList;
$MyList.each(anItem){
if(!vList.contains(anItem)){
vList+=anItem;
}
};
$MyList = vList;
A further consideration is whether the tested list's items are in varying case ('ant' vs. 'Ant' vs. 'ANT' etc.). For instance, to take a mixed case list with duplicates and end up with a de-duped all-lowercase version, use:
var:list vList;
$MyList.lowercase.each(anItem){
if(!vList.contains(anItem)){
vList+=anItem;
}
};
$MyList = vList;