Ich habe ein Problem mit JavaScript, das in einer App mit Rhino 1.5 R5 (Rhino 1.5 Release 5 2004 03 25) evaluiert wird. Ich kann Rhino nicht unabhängig aktualisieren.Rhino 1.5 R5 bewertet JavaScript beim Auffinden von Array-Unterschieden nicht richtig
Ich habe zwei Arrays: die ursprünglichen Daten (pastedArr) und ein Array von nur gültigen Werten (validedArr) und ich versuche, den Unterschied zu finden (die "schlechten" Werte). Ich habe eine Funktion online gefunden, um zu helfen (sym), und ich musste forEach Prototyping, aber es funktioniert perfekt in jsfiddle (https://jsfiddle.net/zr3abc0c/).
In App, mit Rhino, gibt es keine Elemente, die Integer sind (obwohl sie als Strings gespeichert sind), wie das Skript unten und in der Fiddle-Link, die ["33"] auf jsfiddle, aber null in zurückgibt meine Bewerbung. Wenn Parameter 0 ["33", "1A", "ABC"] wäre, würde es nur ["1A", "ABC"] in App zurückgeben.
Ich kann nicht herausfinden, wo es mit diesen String-Elementen "Ganzzahl" fehlschlägt.
// Production steps of ECMA-262, Edition 5, 15.4.4.18
// Reference: http://es5.github.io/#x15.4.4.18
if (!Array.prototype.forEach) {
Array.prototype.forEach = function(callback, thisArg) {
var T, k;
if (this == null) {
throw new TypeError(' this is null or not defined');
}
// 1. Let O be the result of calling toObject() passing the
// |this| value as the argument.
var O = Object(this);
// 2. Let lenValue be the result of calling the Get() internal
// method of O with the argument "length".
// 3. Let len be toUint32(lenValue).
var len = O.length >>> 0;
// 4. If isCallable(callback) is false, throw a TypeError exception.
// See: http://es5.github.com/#x9.11
if (typeof callback !== "function") {
throw new TypeError(callback + ' is not a function');
}
// 5. If thisArg was supplied, let T be thisArg; else let
// T be undefined.
if (arguments.length > 1) {
T = thisArg;
}
// 6. Let k be 0
k = 0;
// 7. Repeat, while k < len
while (k < len) {
var kValue;
// a. Let Pk be ToString(k).
// This is implicit for LHS operands of the in operator
// b. Let kPresent be the result of calling the HasProperty
// internal method of O with argument Pk.
// This step can be combined with c
// c. If kPresent is true, then
if (k in O) {
// i. Let kValue be the result of calling the Get internal
// method of O with argument Pk.
kValue = O[k];
// ii. Call the Call internal method of callback with T as
// the this value and argument list containing kValue, k, and O.
callback.call(T, kValue, k, O);
}
// d. Increase k by 1.
k++;
}
// 8. return undefined
};
}
function sym(/* pass one or more arrays here */) {
var ans = [],
cnts = {},
currentMap;
//count all items in the array
for (var i = 0; i < arguments.length; i++) {
currentMap = {};
arguments[i].forEach(function(item) {
// if we haven't already counted this item in this array
if (!currentMap.hasOwnProperty(item)) {
if (cnts.hasOwnProperty(item)) {
// increase cnt
++cnts[item].cnt;
} else {
// initalize cnt and value
cnts[item] = {
cnt: 1,
val: item
};
}
}
// keep track of whethere we've already counted this item in this array
currentMap[item] = true;
});
}
// output all items that have a cnt of 1
for (var item in cnts) {
if (cnts.hasOwnProperty(item) && cnts[item].cnt === 1) {
ans.push(cnts[item].val);
}
}
return ans;
}
function sort_uniq_fast(a) {
var seen = {};
var out = [];
var len = a.length;
var j = 0;
for (var i = 0; i < len; i++) {
var item = a[i];
if (seen[item] !== 1) {
seen[item] = 1;
out[j++] = item;
}
}
return out.sort();
}
function getBadCodes(pastedArr, validatedArr) {
var result = sym(pastedArr, validatedArr);
return sort_uniq_fast(result);
}
var parameter0 = ["33"];
var parameter1 = new Array();
alert(getBadCodes(parameter0,parameter1));
funktionierts und löst die gestellte Frage, aber es ist ein anderes Problem macht. var parameter0 = [null, "1a", "33", "33-D-1A"]; var parameter1 = ["33-D-1A"]; Dies würde ["1a", "33", null] zurückgeben, jetzt gibt es ["1a", "33", "null"] zurück, was "null" für die Schnittstelle/user – trueimage
@ david-p-caldwell I anzeigt gerade hinzugefügt eine if-Klausel zu Ihrer Präfix-Funktion 'Funktionspräfix (Array) { var rv = []; für (var i = 0; i
trueimage
Ja, der angegebene Ansatz funktioniert nicht für" null ". Was wäre die "richtige" Handhabung von Null für Ihren Fall? –