/** * Iterate over all elements in the object and find all elements for which the matching function is true. * The match is called with the following signature: * * function match(arrayElement: Object, elementIndex: Number, arr: Array): Boolean * * @param match Matching function * @return Returns a new array containing all matching elements. */ static EjsVar *findAll(Ejs *ejs, EjsArray *ap, int argc, EjsVar **argv) { EjsVar *funArgs[3]; EjsBoolean *result; EjsArray *elements; int i; mprAssert(argc == 1 && ejsIsFunction(argv[0])); elements = ejsCreateArray(ejs, 0); if (elements == 0) { ejsThrowMemoryError(ejs); return 0; } for (i = 0; i < ap->length; i++) { funArgs[0] = ap->obj.properties.slots[i]; /* Array element */ funArgs[1] = (EjsVar*) ejsCreateNumber(ejs, i); /* element index */ funArgs[2] = (EjsVar*) ap; /* Array */ result = (EjsBoolean*) ejsRunFunction(ejs, (EjsFunction*) argv[0], 0, 3, funArgs); if (result == 0 || !ejsIsBoolean(result) || !result->value) { setArrayProperty(ejs, elements, elements->length, ap->obj.properties.slots[i]); } } return (EjsVar*) elements; }
/* * Append an item to an array * * function append(obj: Object) : Array */ static EjsVar *appendArray(Ejs *ejs, EjsArray *ap, int argc, EjsVar **argv) { if (setArrayProperty(ejs, ap, ap->length, argv[0]) < 0) { return 0; } return (EjsVar*) ap; }
static EjsVar *makeIntersection(Ejs *ejs, EjsArray *lhs, EjsArray *rhs) { EjsArray *result; EjsVar **l, **r, **resultSlots; int i, j, k; result = ejsCreateArray(ejs, 0); l = lhs->data; r = rhs->data; for (i = 0; i < lhs->length; i++) { for (j = 0; j < rhs->length; j++) { if (compareArrayElement(ejs, l[i], r[j])) { resultSlots = result->data; for (k = 0; k < result->length; k++) { if (compareArrayElement(ejs, l[i], resultSlots[k])) { break; } } if (result->length == 0 || k == result->length) { setArrayProperty(ejs, result, -1, l[i]); } } } } return (EjsVar*) result; }
PUBLIC int ejsAddItem(Ejs *ejs, EjsArray *ap, EjsAny *item) { int index; index = ap->length; if (setArrayProperty(ejs, ap, index, item) < 0) { return MPR_ERR_MEMORY; } return index; }
static int addUnique(Ejs *ejs, EjsArray *ap, EjsVar *element) { int i; for (i = 0; i < ap->length; i++) { if (compareArrayElement(ejs, ap->data[i], element)) { break; } } if (i == ap->length) { if (setArrayProperty(ejs, ap, -1, element) < 0) { return EJS_ERR; } } return 0; }