2016-04-07 22 views
0

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));

Antwort

1

Ich habe keine Rhino 1.5R5 herumliegen, aber Rhino behandelt integer Eigenschaften wie besondere, die aufgrund ihrer Verwendung in Array. Ich spekuliere, dass es in Rhino 1.5R5 einen Bug in dieser Handhabung gibt.

Ich würde vorschlagen, die Elemente vor zu verarbeiten, um das Ergebnis zu vergleichen und nachzubearbeiten, wie ich in dieser Antwort (siehe Präfix und Prefix).

Lassen Sie uns wissen, ob es funktioniert! (Und ich werde die Antwort entsprechend aktualisieren.)

// 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 prefix(array) { 
 
    var rv = []; 
 
    for (var i=0; i<array.length; i++) { 
 
     rv[i] = "A" + array[i]; 
 
    } 
 
    return rv; 
 
} 
 

 
function unprefix(array) { 
 
    var rv = []; 
 
    for (var i=0; i<array.length; i++) { 
 
     rv[i] = array[i].substring(1); 
 
    } 
 
    return rv; 
 
} 
 

 
function getBadCodes(pastedArr, validatedArr) { 
 
    var result = unprefix(sym(prefix(pastedArr), prefix(validatedArr))); 
 
    return sort_uniq_fast(result); 
 
} 
 

 
    var parameter0 = ["33"]; 
 
    var parameter1 = new Array(); 
 

 
alert(getBadCodes(parameter0,parameter1));

+0

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

+0

@ 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

+0

Ja, der angegebene Ansatz funktioniert nicht für" null ". Was wäre die "richtige" Handhabung von Null für Ihren Fall? –