Как проверить, содержит ли массив объект в JavaScript?

Два способа сделать это. Либо включите «my» пространство имен в тег таблицы стилей, как это:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="(insertnamespacehere)">

и do

<xsl:template match="my:account/my:name/text()">

или сделайте довольно неуклюже:

<xsl:template match="*[local-name()='account']/*[local-name()='name']/text()">

Я бы склонен препятствовать последнему подходу, хотя существуют пространства имен, чтобы различать элементы, имеющие одно и то же локальное имя (например, например, employee:name и company:name), используя local-name(), вы игнорируете это различие. Другими словами, если ваш документ содержит foo:account/foo:name, вы также случайно замените его.

Кстати, ваш последний образец XML недействителен - пространство имен my не объявлено. Ваш корень my:accounts должен будет включить это с помощью <my:accounts xlmns:my="(insertnamespacehere)">

3680
задан Karim 26 February 2019 в 13:30
поделиться

9 ответов

Текущие браузеры имеют Массив # включает , что делает ровно , что широко поддерживается , и имеет polyfill для старых браузеров.

> ['joe', 'jane', 'mary'].includes('jane');
true 

Вы также можете использовать Array # indexOf , который менее прямой, но не требует полифиллов для устаревших браузеров.

jQuery предлагает $ .inArray , который функционально эквивалентен Array # indexOf .

underscore.js , служебной библиотеке JavaScript,

4184
ответ дан 17 December 2019 в 16:00
поделиться

indexOf , возможно, но это - "расширение JavaScript стандарта ECMA-262; как таковой это не может присутствовать в других реализациях стандарта".

Пример:

[1, 2, 3].indexOf(1) => 0
["foo", "bar", "baz"].indexOf("bar") => 1
[1, 2, 3].indexOf(4) => -1

AFAICS Microsoft делает не , предлагают некоторую альтернативу этому, но можно добавить схожую функциональность к массивам в Internet Explorer (и другие браузеры, которые не поддерживают indexOf), если Вы хотите, как , быстрый поиск Google показывает (например, этот ).

184
ответ дан Peter Mortensen 26 February 2019 в 13:30
поделиться

Обновление с 2019: Этот ответ с 2008 (11 лет!) и не важно для современного использования JS. Обещанное повышение производительности было основано на сравнительном тесте, сделанном в браузерах того времени. Это не могло бы относиться к современным контекстам выполнения JS. Если Вы нуждаетесь в легком решении, ищете другие ответы. Если Вы нуждаетесь в лучшей производительности, сравниваете для себя в соответствующих средах выполнения.

, Поскольку другие сказали, повторение через массив является, вероятно, лучшим способом, но это было доказано , которого уменьшение while цикл является самым быстрым способом выполнить итерации в JavaScript. Таким образом, можно хотеть переписать код следующим образом:

function contains(a, obj) {
    var i = a.length;
    while (i--) {
       if (a[i] === obj) {
           return true;
       }
    }
    return false;
}

, Конечно, можно также расширить прототип Массива:

Array.prototype.contains = function(obj) {
    var i = this.length;
    while (i--) {
        if (this[i] === obj) {
            return true;
        }
    }
    return false;
}

И теперь можно просто использовать следующее:

alert([1, 2, 3].contains(2)); // => true
alert([1, 2, 3].contains('2')); // => false
391
ответ дан Damir Zekić 26 February 2019 в 13:30
поделиться

При использовании JavaScript 1.6 или позже (Firefox 1.5, или позже) можно использовать Array.indexOf. Иначе я думаю, что Вы собираетесь закончить с чем-то подобным Вашему исходному коду.

12
ответ дан Andru Luvisi 26 February 2019 в 13:30
поделиться
  • 1
    @finnw: можно ли уточнить? Я don' t знают что-либо о .net исключениях, но теперь I' m любопытный, что Вы имеете в виду. – Peter Štibraný 20 January 2011 в 10:27

Вот JavaScript 1.6, совместимый реализация Array.indexOf:

if (!Array.indexOf) {
    Array.indexOf = [].indexOf ?
        function(arr, obj, from) {
            return arr.indexOf(obj, from);
        } :
        function(arr, obj, from) { // (for IE6)
            var l = arr.length,
                i = from ? parseInt((1 * from) + (from < 0 ? l : 0), 10) : 0;
            i = i < 0 ? 0 : i;
            for (; i < l; i++) {
                if (i in arr && arr[i] === obj) {
                    return i;
                }
            }
            return -1;
        };
}
73
ответ дан Narendra Jadhav 26 February 2019 в 13:30
поделиться
  • 1
    Математика является реальным классом не интерфейс, таким образом, Математика. PI не является примером этого антишаблона. – John Topley 3 August 2009 в 11:11

Вот как Prototype это делает :

/**
 *  Array#indexOf(item[, offset = 0]) -> Number
 *  - item (?): A value that may or may not be in the array.
 *  - offset (Number): The number of initial items to skip before beginning the
 *      search.
 *
 *  Returns the position of the first occurrence of `item` within the array &mdash; or
 *  `-1` if `item` doesn't exist in the array.
**/
function indexOf(item, i) {
  i || (i = 0);
  var length = this.length;
  if (i < 0) i = length + i;
  for (; i < length; i++)
    if (this[i] === item) return i;
  return -1;
}

Также см. здесь , чтобы узнать, как они его подключают.

4
ответ дан 17 December 2019 в 16:00
поделиться

Расширение объекта JavaScript Array - действительно плохая идея, потому что вы вводите новые свойства (свои собственные методы) в циклы for-in , которые могут нарушить существующие скрипты. Несколько лет назад авторам библиотеки Prototype пришлось перепроектировать реализацию своей библиотеки, чтобы удалить именно такие вещи.

Если вам не нужно беспокоиться о совместимости с другим JavaScript, работающим на свою страницу, дерзайте, иначе я бы порекомендовал более неудобное, но более безопасное автономное функциональное решение.

45
ответ дан 17 December 2019 в 16:00
поделиться

Размышляя на секунду, если вы делаете этот вызов много раз, гораздо эффективнее использовать ассоциативный массив карту для выполнения поиска с помощью хэш-функции.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

29
ответ дан 17 December 2019 в 16:00
поделиться

Еще один вариант

// usage: if ( ['a','b','c','d'].contains('b') ) { ... }
Array.prototype.contains = function(value){
    for (var key in this)
        if (this[key] === value) return true;
    return false;
}

Будьте осторожны, потому что перегрузка объектов массива javascript пользовательскими методами может нарушить поведение других javascript, вызывая неожиданное поведение.

-9
ответ дан 17 December 2019 в 16:00
поделиться
Другие вопросы по тегам:

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