Поскольку никто еще не упомянул об этом, вот начало решения, использующего 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. В зависимости от ваших требований Джексон и Нашорн могут быть жизнеспособными решениями.
В документе doc для angular.equals()
указано:
Два объекта или значения считаются эквивалентными, если хотя бы одно из следующего верно:
Оба объекта или значения проходят === сравнение.
Оба объекта или значения одного типа, и все их свойства равны, сравнивая их с угловыми.
Оба значения - NaN. (В JavaScript, NaN ==> NaN => false, но мы считаем, что два NaN равны)
Оба значения представляют одно и то же регулярное выражение (In JavasScript, / abc / == / abc / => false Но мы считаем два регулярных выражения равными, когда их текстовое представление соответствует).
blockquote>Итак, если вы получаете ложь для
.equals()
, то мы можем заключить следующее:
- Оба не являются одним и тем же объектом, поэтому они не проходят
===
- Оба значения не являются NaN (вы все равно работаете с объектами)
- Оба значения не являются одним и тем же регулярным выражением
Таким образом, это оставляет только 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]);
Я предлагаю вам попробовать отладку.
Откройте панель разработчика в Chrome, поместите break-point
в функцию равенства в угловом коде. Теперь, когда происходит сравнение, переходите по строкам, переходя по строкам. Проверьте, в какой момент его возвращение ложно, и вы, вероятно, получите причину.
Или получить функцию равенства от углового источника:
Измените его с помощью консольных журналов на каждом return false
и используйте эту функцию для сравнения ваших объектов с целью отладки.