From bc73363afa2163e5934b6d4d7b9c41feb505ebd1 Mon Sep 17 00:00:00 2001 From: Lars Hvam <5888506+larshp@users.noreply.github.com> Date: Tue, 7 Apr 2026 20:43:12 +0200 Subject: [PATCH] array filter() --- src/zcl_mjs.clas.abap | 32 +++++++++++++++++++++++++++++++ src/zcl_mjs.clas.testclasses.abap | 12 ++++++++++++ 2 files changed, 44 insertions(+) diff --git a/src/zcl_mjs.clas.abap b/src/zcl_mjs.clas.abap index 3059041..60b34e1 100644 --- a/src/zcl_mjs.clas.abap +++ b/src/zcl_mjs.clas.abap @@ -2527,6 +2527,38 @@ CLASS zcl_mjs IMPLEMENTATION. ENDIF. ENDIF. RETURN. + WHEN `filter`. + IF lines( it_args ) > 0. + DATA ls_flt_cb TYPE zif_mjs=>ty_value. + READ TABLE it_args INDEX 1 INTO ls_flt_cb. + IF ls_flt_cb-type = 4 AND ls_flt_cb-fn IS BOUND. + DATA lo_flt_arr TYPE REF TO zcl_mjs_arr. + CREATE OBJECT lo_flt_arr. + DATA lv_flt_idx TYPE i VALUE 0. + LOOP AT is_obj-arr->items INTO DATA(lr_flt_item). + DATA ls_flt_elem TYPE zif_mjs=>ty_value. + ls_flt_elem = unbox_value( lr_flt_item ). + DATA lt_flt_args TYPE zif_mjs=>tt_value_slots. + CLEAR lt_flt_args. + APPEND ls_flt_elem TO lt_flt_args. + APPEND number_val( CONV f( lv_flt_idx ) ) TO lt_flt_args. + APPEND is_obj TO lt_flt_args. + DATA(ls_flt_result) = call_function( + ir_fn = ls_flt_cb-fn + it_args = lt_flt_args + io_env = io_env ). + IF is_true( ls_flt_result ) = abap_true. + lo_flt_arr->push( lr_flt_item ). + ENDIF. + lv_flt_idx = lv_flt_idx + 1. + ENDLOOP. + rs_val-type = 7. + rs_val-arr = lo_flt_arr. + ENDIF. + ELSE. + rs_val = array_val( VALUE #( ) ). + ENDIF. + RETURN. WHEN `splice`. DATA lt_spl_args TYPE zif_mjs=>tt_value_slots. lt_spl_args = it_args. diff --git a/src/zcl_mjs.clas.testclasses.abap b/src/zcl_mjs.clas.testclasses.abap index 0115618..7829f1f 100644 --- a/src/zcl_mjs.clas.testclasses.abap +++ b/src/zcl_mjs.clas.testclasses.abap @@ -101,6 +101,7 @@ CLASS ltcl_test DEFINITION FOR TESTING METHODS test_set_has FOR TESTING RAISING zcx_mjs_runtime. METHODS test_namespace_class FOR TESTING RAISING zcx_mjs_runtime. METHODS test_class_typeof FOR TESTING RAISING zcx_mjs_runtime. + METHODS test_array_filter FOR TESTING RAISING zcx_mjs_runtime. METHODS test262 FOR TESTING RAISING zcx_mjs_runtime. @@ -856,6 +857,17 @@ CLASS ltcl_test IMPLEMENTATION. exp = |function| ). ENDMETHOD. + METHOD test_array_filter. + DATA(lv_nl) = cl_abap_char_utilities=>newline. + DATA(lv_js) = + `const arr = [1, 2, 3, 4, 5];` && lv_nl && + `const filtered = arr.filter(x => x > 2);` && lv_nl && + `console.log(filtered.length);`. + cl_abap_unit_assert=>assert_equals( + act = trim( zcl_mjs=>eval( lv_js ) ) + exp = |3| ). + ENDMETHOD. + METHOD test262. DATA(lv_nl) = cl_abap_char_utilities=>newline. DATA(lv_js) =