static void scArrayRemove(const CFunctionsScopePtr &c, void *data) { CScriptVarPtr obj = c->getArgument("obj"); CScriptVarPtr arr = c->getArgument("this"); int i; vector<int> removedIndices; int l = arr->getArrayLength(); CScriptVarPtr equal = c->constScriptVar(Undefined); for (i=0;i<l;i++) { equal = obj->mathsOp(arr->getArrayIndex(i), LEX_EQUAL); if(equal->toBoolean()) { removedIndices.push_back(i); } } if(removedIndices.size()) { vector<int>::iterator remove_it = removedIndices.begin(); int next_remove = *remove_it; int next_insert = *remove_it++; for (i=next_remove;i<l;i++) { CScriptVarLinkPtr link = arr->findChild(int2string(i)); if(i == next_remove) { if(link) arr->removeLink(link); if(remove_it != removedIndices.end()) next_remove = *remove_it++; } else { if(link) { arr->setArrayIndex(next_insert++, link); arr->removeLink(link); } } } } }
static void scArrayContains(const CFunctionsScopePtr &c, void *data) { CScriptVarPtr obj = c->getArgument("obj"); CScriptVarPtr arr = c->getArgument("this"); int l = arr->getArrayLength(); CScriptVarPtr equal = c->constScriptVar(Undefined); for (int i=0;i<l;i++) { equal = obj->mathsOp(arr->getArrayIndex(i), LEX_EQUAL); if(equal->toBoolean()) { c->setReturnVar(c->constScriptVar(true)); return; } } c->setReturnVar(c->constScriptVar(false)); }