Lua - Filter Iterators



A filter function is the function which when called returned the filtered result as per the given condition. In Lua, we can define a filter iterator easliy.

Write a Filter function

Let's first create a generic filter function which can accept an array and a filter iterator.

-- define a filter with filter iterator
table.filter = function(array, filterIterator)

   -- filter result to be returned
   local result = {}

   -- iterate over main array
   for key, value in pairs(array) do

      -- call filterIterator
      if filterIterator(value, key, array) then
	     -- append the value in filtered result
		 table.insert(result,value)
	  end
   end

   -- return the filtered result
   return result
end

Explanation

  • We've created a function as table.filter.

  • This function is accepting an array and an iterator function.

  • In function, we've a for loop and then call the iterator() to filter the corresponding value.

  • If filterIterator returns true, we're storing the value in resultant array.

  • Finally resultant array is returned as filtered array output.

Call the Filter function to filter the array

While calling the filter function, we're passing a iterator function which can check a number to be even or not.

-- source array
array = {1, 2, 3, 4, 5, 6, 7, 8, 9}

-- call the filter with even number filter
filteredArray = table.filter(array,
   -- event number filter
   function(element, key, index)
      return element % 2 == 0
   end
)

Print the filtered array

for key,value in ipairs(filteredArray) do
   print(key,value)
end

Complete Example of using Iterators

Following example shows the use of Iterator to filter odd numbers out of a list.

main.lua

-- define a filter with filter iterator
table.filter = function(array, filterIterator)

   -- filter result to be returned
   local result = {}

   -- iterate over main array
   for key, value in pairs(array) do

      -- call filterIterator
      if filterIterator(value, key, array) then
	     -- append the value in filtered result
		 table.insert(result,value)
	  end
   end

   -- return the filtered result
   return result
end

-- source array
array = {1, 2, 3, 4, 5, 6, 7, 8, 9}

-- call the filter with even number filter
filteredArray = table.filter(array,
   -- event number filter
   function(element, key, index)
      return element % 2 == 0
   end
)


for key,value in ipairs(filteredArray) do
   print(key,value)
end

Output

When the above code is built and executed, it produces the following result −

1	2
2	4
3	6
4	8
Advertisements