What’s an elegant way to extract every item from a list of lists of indeterminate depth?
For example, given.
set listOfLists to {{"blue", "red", {"shade", {"dark", "medium", "light"}}}, {"rough", {"nubbly", "raspy"}, {}}, "fabric"}
.I’d like to get.
set flatlist to set listOfLists to {"blue", "red", "shade", "dark", "medium", "light", "rough", "nubbly", "raspy", "fabric"}
I get vertigo every time I try to code a handler that calls itself and could use some guidance.
Thanks much,
Bryan
How about something like this (not recursive at all):
set listOfLists to {{"blue", "red", {"shade", {"dark", "medium", "light"}}}, {"rough", {"nubbly", "raspy"}, {}}, "fabric"}
set tid to AppleScript's text item delimiters
set AppleScript's text item delimiters to space
set L to listOfLists as text
set AppleScript's text item delimiters to tid
set FL to words of L
FL --> {"blue", "red", "shade", "dark", "medium", "light", "rough", "nubbly", "raspy", "fabric"}
Neat!
Here’s a recursive method, in case the list items aren’t necessarily text:
on flatten(listOfLists)
script o
property fl : {}
on flttn(l)
script p
property lol : l
end script
repeat with i from 1 to (count l)
set v to item i of p's lol
if (v's class is list) then
flttn(v)
else
set end of my fl to v
end if
end repeat
end flttn
end script
tell o
flttn(listOfLists)
return its fl
end tell
end flatten
set listOfLists to {{"blue", "red", {"shade", {"dark", "medium", "light"}}}, {"rough", {"nubbly", "raspy"}, {}}, "fabric"}
flatten(listOfLists)
1 Like
Also neat (and recursive!)
Woo hoo!
Thanks much - you guys are terrific. Problem solved & interesting things learned.
Happy happy,
Bryan