равен нулю и пустое равенство строк в угловом js [дубликат]

Поскольку никто еще не упомянул об этом, вот начало решения, использующего Nashorn (часть выполнения JavaScript для Java 8).

Решение

private static final String EXTRACTOR_SCRIPT =
    "var fun = function(raw) { " +
    "var json = JSON.parse(raw); " +
    "return [json.pageInfo.pageName, json.pageInfo.pagePic, json.posts[0].post_id];};";

public void run() throws ScriptException, NoSuchMethodException {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
    engine.eval(EXTRACTOR_SCRIPT);
    Invocable invocable = (Invocable) engine;
    JSObject result = (JSObject) invocable.invokeFunction("fun", JSON);
    result.values().forEach(e -> System.out.println(e));
}

Сравнение производительности

Я написал контент JSON, содержащий три массива соответственно 20, 20 и 100 элементов. Я хочу получить только 100 элементов из третьего массива. Я использую следующую функцию JavaScript для синтаксического анализа и получения моих записей.

var fun = function(raw) {JSON.parse(raw).entries};

Выполнение вызова в миллион раз с использованием Nashorn занимает 7.5 ~ 7.8 секунд

(JSObject) invocable.invokeFunction("fun", json);

org.json принимает 20 ~ 21 секунд

new JSONObject(JSON).getJSONArray("entries");

Джексон занимает 6,5 ~ 7 секунд

mapper.readValue(JSON, Entries.class).getEntries();

В этом случае Джексон работает лучше, чем Nashorn, который работает намного лучше, чем org.json. Nashorn API сложнее использовать, чем org.json или Jackson's. В зависимости от ваших требований Джексон и Нашорн могут быть жизнеспособными решениями.

3
задан Samantha J T Star 8 March 2014 в 09:30
поделиться

2 ответа

В документе doc для angular.equals() указано:

Два объекта или значения считаются эквивалентными, если хотя бы одно из следующего верно:

Оба объекта или значения проходят === сравнение.

Оба объекта или значения одного типа, и все их свойства равны, сравнивая их с угловыми.

Оба значения - NaN. (В JavaScript, NaN ==> NaN => false, но мы считаем, что два NaN равны)

Оба значения представляют одно и то же регулярное выражение (In JavasScript, / abc / == / abc / => false Но мы считаем два регулярных выражения равными, когда их текстовое представление соответствует).

Итак, если вы получаете ложь для .equals(), то мы можем заключить следующее:

  1. Оба не являются одним и тем же объектом, поэтому они не проходят ===
  2. Оба значения не являются NaN (вы все равно работаете с объектами)
  3. Оба значения не являются одним и тем же регулярным выражением

Таким образом, это оставляет только 2-й элемент в документации, что означает, что либо объекты не являются одним и тем же типом, либо некоторые из их свойств не являются одна и та же.

Если у вас есть минимальная версия углового, установленная в вашем приложении, то для каждого, кто может помочь вам в дальнейшем, что именно отличается от них, нам нужно будет увидеть фактические объекты или код, который их создает. page, вы также можете просто навести свой вызов на angular.equals() и посмотреть, какой шаг в коде он находит разницу.

Или, если есть много свойств или много объектов, поэтому шаг в отладчике сложно, вы можете написать свою собственную небольшую процедуру отладки, чтобы сообщить вам, какое свойство было другим. Это будет выглядеть примерно так:

function compareObjects(s, t) {
    if (typeof s !== typeof t) {
        console.log("two objects not the same type");
        return;
    }
    if (typeof s !== "object") {
        console.log('arguments are not typeof === "object"');
        return;
    }
    for (var prop in s) {
        if (s.hasOwnProperty(prop)) {
            if (t.hasOwnProperty(prop)) {
                if (!angular.equals(s[prop], t[prop])) {
                    console.log("property " + prop + " does not match");
                }
            } else {
                console.log("second object does not have property " + prop);
            }
        }
    }
    // now verify that t doesn't have any properties 
    // that are missing from s
    for (prop in t) {
        if (t.hasOwnProperty(prop)) {
            if (!s.hasOwnProperty(prop)) {
                console.log("first object does not have property " + prop);
            }
        }
    }
}


// then call this function on your two objects
// and then look in the debug console to see what it reports
compareObjects(rowData, $scope.grid.backup[i]);
7
ответ дан jfriend00 27 August 2018 в 04:00
поделиться

Я предлагаю вам попробовать отладку.

Откройте панель разработчика в Chrome, поместите break-point в функцию равенства в угловом коде. Теперь, когда происходит сравнение, переходите по строкам, переходя по строкам. Проверьте, в какой момент его возвращение ложно, и вы, вероятно, получите причину.

Или получить функцию равенства от углового источника:

https://github.com/ angular / angular.js / blob / 124e9b803ffabee407531da5dd1d3ac6ca1d1ffb / src / Angular.js # L604

Измените его с помощью консольных журналов на каждом return false и используйте эту функцию для сравнения ваших объектов с целью отладки.

3
ответ дан sabithpocker 27 August 2018 в 04:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: