diff --git a/indra/llcommon/llkeybind.cpp b/indra/llcommon/llkeybind.cpp
index f47ba41bae68234f6eea845e615f69ab08de694b..12e57ae94b97c2b7579e0afe47d8316764269e45 100644
--- a/indra/llcommon/llkeybind.cpp
+++ b/indra/llcommon/llkeybind.cpp
@@ -30,6 +30,7 @@
 
 #include "llsd.h"
 #include "llsdutil.h"
+#include <algorithm>
 
 LLKeyData::LLKeyData()
     :
@@ -213,19 +214,23 @@ bool LLKeyBind::isEmpty() const
     return true;
 }
 
-LLSD LLKeyBind::asLLSD() const
+LLKeyBind::data_vector_t::const_iterator LLKeyBind::endNonEmpty() const
 {
-    auto last = mData.size() - 1;
-    while (mData[last].empty())
-    {
-        last--;
-    }
+    // search backwards for last non-empty entry, then turn back into forwards
+    // iterator (.base() call)
+    return std::find_if_not(mData.rbegin(), mData.rend(),
+                            [](const auto& kdata){ return kdata.empty(); }).base();
+}
 
+LLSD LLKeyBind::asLLSD() const
+{
     LLSD data;
-    for (S32 i = 0; i <= last; ++i)
+    auto end{ endNonEmpty() };
+    for (auto it = mData.begin(); it < end; ++it)
     {
-        // append even if empty to not affect visual representation
-        data.append(mData[i].asLLSD());
+        // append intermediate entries even if empty to not affect visual
+        // representation
+        data.append(it->asLLSD());
     }
     return data;
 }
@@ -380,16 +385,10 @@ void LLKeyBind::resetKeyData(S32 index)
 
 void LLKeyBind::trimEmpty()
 {
-    auto last = mData.size() - 1;
-    while (last >= 0 && mData[last].empty())
-    {
-        mData.erase(mData.begin() + last);
-        last--;
-    }
+    mData.erase(endNonEmpty(), mData.end());
 }
 
 size_t LLKeyBind::getDataCount()
 {
     return mData.size();
 }
-
diff --git a/indra/llcommon/llkeybind.h b/indra/llcommon/llkeybind.h
index f63ad1d64e1eace9238164bd46eb66dbc1e3a0fd..488f5094117c286a02ac7991f7151d8e77bca2a0 100644
--- a/indra/llcommon/llkeybind.h
+++ b/indra/llcommon/llkeybind.h
@@ -100,6 +100,8 @@ class LLKeyBind
 private:
     typedef std::vector<LLKeyData> data_vector_t;
     data_vector_t mData;
+
+    data_vector_t::const_iterator endNonEmpty() const;
 };