]> git.kaiwu.me - njs.git/commitdiff
Array.prototype.findIndex() method.
authorAndrey Zelenkov <zelenkov@nginx.com>
Tue, 4 Apr 2017 03:16:49 +0000 (06:16 +0300)
committerAndrey Zelenkov <zelenkov@nginx.com>
Tue, 4 Apr 2017 03:16:49 +0000 (06:16 +0300)
njs/njs_array.c
njs/test/njs_unit_test.c

index 381e0822cc9306a7f9c4494fd5b51d7fd58d8c53..46f10789d5e37d1b4df1ea4f32cf10b514ab9487 100644 (file)
@@ -100,6 +100,8 @@ static njs_ret_t njs_array_prototype_filter_continuation(njs_vm_t *vm,
     njs_value_t *args, nxt_uint_t nargs, njs_index_t unused);
 static njs_ret_t njs_array_prototype_find_continuation(njs_vm_t *vm,
     njs_value_t *args, nxt_uint_t nargs, njs_index_t unused);
+static njs_ret_t njs_array_prototype_find_index_continuation(njs_vm_t *vm,
+    njs_value_t *args, nxt_uint_t nargs, njs_index_t unused);
 static njs_ret_t njs_array_prototype_map_continuation(njs_vm_t *vm,
     njs_value_t *args, nxt_uint_t nargs, njs_index_t unused);
 static nxt_noinline uint32_t njs_array_prototype_map_index(njs_array_t *array,
@@ -1531,6 +1533,54 @@ njs_array_prototype_find_continuation(njs_vm_t *vm, njs_value_t *args,
 }
 
 
+static njs_ret_t
+njs_array_prototype_find_index(njs_vm_t *vm, njs_value_t *args,
+    nxt_uint_t nargs, njs_index_t unused)
+{
+    nxt_int_t         ret;
+    njs_array_iter_t  *iter;
+
+    ret = njs_array_iterator_args(vm, args, nargs);
+    if (nxt_slow_path(ret != NXT_OK)) {
+        return ret;
+    }
+
+    iter = njs_vm_continuation(vm);
+    iter->u.cont.function = njs_array_prototype_find_index_continuation;
+    iter->retval.data.truth = 0;
+
+    return njs_array_prototype_find_index_continuation(vm, args, nargs, unused);
+}
+
+
+static njs_ret_t
+njs_array_prototype_find_index_continuation(njs_vm_t *vm, njs_value_t *args,
+    nxt_uint_t nargs, njs_index_t unused)
+{
+    double             index;
+    njs_array_iter_t   *iter;
+
+    iter = njs_vm_continuation(vm);
+    index = iter->index;
+
+    if (!njs_is_true(&iter->retval)) {
+        iter->index++;
+
+        if (iter->index < iter->length
+            && iter->index < args[0].data.u.array->length)
+        {
+            return njs_array_prototype_find_apply(vm, iter, args, nargs);
+        }
+
+        index = -1;
+    }
+
+    njs_number_set(&vm->retval, index);
+
+    return NXT_OK;
+}
+
+
 static nxt_noinline njs_ret_t
 njs_array_prototype_find_apply(njs_vm_t *vm, njs_array_iter_t *iter,
     njs_value_t *args, nxt_uint_t nargs)
@@ -2147,6 +2197,14 @@ static const njs_object_prop_t  njs_array_prototype_properties[] =
                      njs_continuation_size(njs_array_find_t), 0),
     },
 
+    /* ES6. */
+    {
+        .type = NJS_METHOD,
+        .name = njs_string("findIndex"),
+        .value = njs_native_function(njs_array_prototype_find_index,
+                     njs_continuation_size(njs_array_iter_t), 0),
+    },
+
     {
         .type = NJS_METHOD,
         .name = njs_string("map"),
index 73cc5dedddf9f2fc41950a391bed9c8727506d3e..5584a6a1f27b51d1573f07446805b12a54862ca1 100644 (file)
@@ -2926,6 +2926,50 @@ static njs_unit_test_t  njs_test[] =
                  "a.find(function(v, i, a) { a.shift(); return v == 4 })"),
       nxt_string("undefined") },
 
+    { nxt_string("var a = [];"
+                 "a.findIndex(function(v, i, a) { return v > 1 })"),
+      nxt_string("-1") },
+
+    { nxt_string("var a = [,NaN,0,-1];"
+                 "a.findIndex(function(v, i, a) { return v > 1 })"),
+      nxt_string("-1") },
+
+    { nxt_string("var a = [,NaN,0,-1,2];"
+                 "a.findIndex(function(v, i, a) { return v > 1 })"),
+     nxt_string("4") },
+
+    { nxt_string("var a = [1,2,3,-1,5];"
+                 "a.findIndex(function(v, i, a) { return v > 1 })"),
+      nxt_string("1") },
+
+    { nxt_string("var a = [,1,,-1,5];"
+                 "a.findIndex(function(v, i, a) { return v > 1 })"),
+      nxt_string("4") },
+
+    { nxt_string("var a = [,1,,-1,5,6];"
+                 "a.findIndex(function(v, i, a) { return v > 1 })"),
+      nxt_string("4") },
+
+    { nxt_string("[].findIndex(function(v) { return (v === undefined) })"),
+      nxt_string("-1") },
+
+    { nxt_string("[,].findIndex(function(v) { return (v === undefined) })"),
+      nxt_string("0") },
+
+    { nxt_string("[1,2,,3].findIndex(function(el){return el === undefined})"),
+      nxt_string("2") },
+
+    { nxt_string("[,2,,3].findIndex(function(el){return el === undefined})"),
+      nxt_string("0") },
+
+    { nxt_string("var a = [1,2,3,4,5,6];"
+                 "a.findIndex(function(v, i, a) { a.shift(); return v == 3 })"),
+      nxt_string("1") },
+
+    { nxt_string("var a = [1,2,3,4,5,6];"
+                 "a.findIndex(function(v, i, a) { a.shift(); return v == 4 })"),
+      nxt_string("-1") },
+
     { nxt_string("var a = [];"
                  "a.map(function(v, i, a) { return v + 1 })"),
       nxt_string("") },