Tinderbox v9 Icon

values([group,]attribute)


Operator Type: 

Operator Scope of Action: 

Operator Purpose: 

Operator First Added: 

Operator Altered: 

 Function   [other Function type actions]

 Group   [operators of similar scope]

 Dictionary, Set & List operations   [other Dictionary, Set & List operations operators]

 Baseline

 


values(attribute)

This returns a Set of unique values for the attribute attribute. As the output is a of Set data type, the list of possible values is de-duped thus giving a list of unique values, and should be sorted. Any suggested values not actually used by at least one note are omitted from the list return by values().

If the named attribute is a set or list, values() returns a list of all the unique discrete list item values that occur. If the named attribute is a string, values() returns all the unique strings.

The returned set is sorted in lexical order.

If a document has a user List-Type attribute $SomeList, then to get a a list of all the unique values for $SomeList in the whole document:

$MyList = values("SomeList"); 

The attribute parameter is evaluated so may be:

Thus if the document has a user List-Type attribute $SomeList and $MyString has the value "SomeList", then these are functionally equivalent:

$MyList = values("SomeList"); 

$MyList = values($MyString); 

It is envisaged that the first method (the quoted, un-prefixed, attribute name) will be the most usual method of using values().

Sorting. The data is returned in case-sensitive lexical sort order (i.e. all capitals sort before lower case letters, and numbers sorting textually not numerically) so chaining .isort() may often be the desired 'default', or use .nsort() if the list is entirely composed of numbers. Assume, the intention is to get a note whose $Text has one value per line. It could be coded thus:

$Text=values("MyList").format("\n"); 

This is a very useful way of making a set of per-value notes. Use values() to collect the values, pass them to a note's $Text as a one-value-per-line string and then explode the $Text.

However, a value list of aardvark/amber/Ant would list in this order: Ant, aardvark, amber. That is due to case-sensitive lexical sorting, whereas a case-insensitive sort would be more appropriate. Thus:

$Text=values("MyList").isort.format("\n"); 

Similarly the default sort would order 1/2/10 and 1/10/2, so a numerical sort would be more sensible:

$Text=values("MyList").isort.format("\n"); 

De-duplication. values() differs from collect() in that values() returns Set-type data and collect() returns List-type data. For a list $MyList, the following are functionally equivalent in output:

$MyList = collect(all,$SomeList).unique; 

$MyList = values("SomeList"); 

$MyList = values($MyString); (where $MyString has the value "SomeList")

values(group,attribute)

If an optional first group parameter is provided, the values returned are drawn only from notes in that scope. The reference point for groups like 'children' or 'siblings' is this note. Thus:

$MyList = values(children,"Subtitle"); 

will return all the discrete subtitles (i.e. values of $Subtitle) for children of this note, i.e. the note in which context the action is being evaluated.

If no first parameter is supplied, as in the short form above, the default group is assumed as 'all' and thus at whole document scope.