Хотя это работает только для скалярных массивов (см. примечание ниже), оно короткое:
array1.length === array2.length && array1.every(function(value, index) { return value === array2[index]})
Rr, в ECMAScript 6 / CoffeeScript / TypeScript со стрелочными функциями:
array1.length === array2.length && array1.every((value, index) => value === array2[index])
(Примечание: здесь «скаляр» означает значения, которые можно напрямую сравнивать с помощью ===
. Итак: числа, строки, объекты по ссылке, функции по ссылке. Подробнее см. в ссылке MDN для получения дополнительной информации о операторах сравнения).
UPDATE
Из того, что я прочитал из комментариев, сортировка массива и сравнение могут дать точный результат:
array1.length === array2.length && array1.sort().every(function(value, index) { return value === array2.sort()[index]});
Например :
array1 = [2,3,1,4];
array2 = [1,2,3,4];
Тогда приведенный выше код даст true
Два из наиболее широко используемых синтаксических анализаторов Эмигрант и libxml.
, Если Вы хорошо с использованием C++, существует Xerces-C++ также.
Два примера с эмигрант и libxml2. Второй, по моему скромному мнению, намного легче использовать, так как он создает дерево в памяти, структура данных, которая легка работать с. эмигрант, с другой стороны, ничего не создает (необходимо сделать это сами), это просто разрешает Вас обработчикам вызовов на определенных событиях во время парсинга. Но эмигрант может быть быстрее (я не имел размеры).
С эмигрантом, читая XML-файл и отображая расположенные с отступом элементы:
/*
A simple test program to parse XML documents with expat
<http://expat.sourceforge.net/>. It just displays the element
names.
On Debian, compile with:
gcc -Wall -o expat-test -lexpat expat-test.c
Inspired from <http://www.xml.com/pub/a/1999/09/expat/index.html>
*/
#include <expat.h>
#include <stdio.h>
#include <string.h>
/* Keep track of the current level in the XML tree */
int Depth;
#define MAXCHARS 1000000
void
start(void *data, const char *el, const char **attr)
{
int i;
for (i = 0; i < Depth; i++)
printf(" ");
printf("%s", el);
for (i = 0; attr[i]; i += 2) {
printf(" %s='%s'", attr[i], attr[i + 1]);
}
printf("\n");
Depth++;
} /* End of start handler */
void
end(void *data, const char *el)
{
Depth--;
} /* End of end handler */
int
main(int argc, char **argv)
{
char *filename;
FILE *f;
size_t size;
char *xmltext;
XML_Parser parser;
if (argc != 2) {
fprintf(stderr, "Usage: %s filename\n", argv[0]);
return (1);
}
filename = argv[1];
parser = XML_ParserCreate(NULL);
if (parser == NULL) {
fprintf(stderr, "Parser not created\n");
return (1);
}
/* Tell expat to use functions start() and end() each times it encounters
* the start or end of an element. */
XML_SetElementHandler(parser, start, end);
f = fopen(filename, "r");
xmltext = malloc(MAXCHARS);
/* Slurp the XML file in the buffer xmltext */
size = fread(xmltext, sizeof(char), MAXCHARS, f);
if (XML_Parse(parser, xmltext, strlen(xmltext), XML_TRUE) ==
XML_STATUS_ERROR) {
fprintf(stderr,
"Cannot parse %s, file may be too large or not well-formed XML\n",
filename);
return (1);
}
fclose(f);
XML_ParserFree(parser);
fprintf(stdout, "Successfully parsed %i characters in file %s\n", size,
filename);
return (0);
}
С libxml2, программа, которая отображает название корневого элемента и имена его детей:
/*
Simple test with libxml2 <http://xmlsoft.org>. It displays the name
of the root element and the names of all its children (not
descendents, just children).
On Debian, compiles with:
gcc -Wall -o read-xml2 $(xml2-config --cflags) $(xml2-config --libs) \
read-xml2.c
*/
#include <stdio.h>
#include <string.h>
#include <libxml/parser.h>
int
main(int argc, char **argv)
{
xmlDoc *document;
xmlNode *root, *first_child, *node;
char *filename;
if (argc < 2) {
fprintf(stderr, "Usage: %s filename.xml\n", argv[0]);
return 1;
}
filename = argv[1];
document = xmlReadFile(filename, NULL, 0);
root = xmlDocGetRootElement(document);
fprintf(stdout, "Root is <%s> (%i)\n", root->name, root->type);
first_child = root->children;
for (node = first_child; node; node = node->next) {
fprintf(stdout, "\t Child is <%s> (%i)\n", node->name, node->type);
}
fprintf(stdout, "...\n");
return 0;
}
Можно попробовать ezxml - это - легкий синтаксический анализатор, записанный полностью в C.
Для C++ можно проверить TinyXML ++
Как насчет одного записанного в чистый ассемблер :-), не забывают проверять сравнительные тесты .
Эмигрант довольно достоин. Трудно дать хорошие рекомендации без большей информации все же.
Вы могли дать некоторый признак того, для каких платформ Вы пишете? Это должно лечь тяжелым бременем на то, что является 'лучшим'. Вы могли бы найти супер библиотеку 'xml-нечто', которая обычно не поставлется в большинстве систем по умолчанию.. в то время как его великое, отсутствие библиотеки могло бы предотвратить (или по крайней мере) раздражают пользователей.
Главным образом, я использую libxml2.. потому что его стандартное или легкое для установки на платформах, для которых я нацелен.
, Как Вы видите, 'лучше всего' также определяется библиотекой, являющейся доступным на Ваших целевых платформах.
http://www.minixml.org также довольно хорош. Маленький и просто ANSI C.
Я предпочитаю libxml2 . Он очень прост в использовании, но я никогда не беспокоился о его тестировании, поскольку я использовал его только для анализа файла конфигурации.