Как петля через массив javascript, чтобы найти совпадение в javascript [дубликат]

Я просто отслеживал эту проблему. Мои симптомы были такими же, как у вас, и я даже пробовал то, что вы пробовали. В итоге моя проблема возникла только потому, что я использовал tomcat для centos с SELinux.

Некоторые люди помогли мне диагностировать, используя следующие команды, чтобы посмотреть события безопасности и почему некоторые действия не были разрешены:

sudo ausearch -m avc
sudo grep "tcp_socket" /var/log/audit/audit.log | audit2why // translates log into some human readable reasons why the audit record was generated

Я видел записи вроде:

type = AVC msg = audit (1507861264.561: 64750): avc: denied {name_connect} для pid = 1326 comm = "java" dest = 3306 scontext = system_u: system_r: tomcat_t: s0 tcontext = system_u: object_r: mysqld_port_t: s0 tclass = tcp_socket

Был вызван: правило разрешения запрещенного типа (TE).

Вы можете используйте audit2allow для создания загружаемого модуля, чтобы разрешить этот доступ.

blockquote>

И затем нашел эту статью о tomcat и SELinux https://noobient.com/post/165972214381/selinux-woes -with-tomcat-on-centos-74

Вы можете запустить следующую команду, чтобы проверить, работает ли tomcat в контексте безопасности tomcat_t.

$ps auxZ | grep tomcat

Для цели по-настоящему определить, была ли моя ошибка SELinux, я отключил SELinux

$ sestatus // shows: SELinux status:                 enabled
$ sudo vim /etc/selinux/config // set "SELINUX=disabled"
$ sudo shutdown -r now
$ sestatus // shows: SELinux status:                 disabled

перезапустил мою машину и увидел, что tomcat теперь делает исходящее соединение.

Отлично, теперь я, по крайней мере, знаю, ПОЧЕМУ, что это происходит. Конечно, если вам нужен SELinux, отключить его НЕ является решением. Другим обходным решением, которое, вероятно, не является решением, является установка tomcat без прохождения yum. Yum установит tomcat, используя контекст безопасности.

Я думаю, что теперь мы должны изменить контекст безопасности или набор правил, управляющих tomcat, чтобы он мог выполнять исходящие соединения.

27
задан Lee Taylor 15 September 2012 в 01:55
поделиться

12 ответов

Естественно, мой подход состоял в том, чтобы пропустить первый массив один раз и проверить индекс каждого значения во втором массиве. Если индекс > -1, то push он на возвращаемом массиве.

​Array.prototype.diff = function(arr2) {
    var ret = [];
    for(var i in this) {   
        if(arr2.indexOf(this[i]) > -1){
            ret.push(this[i]);
        }
    }
    return ret;
};

Мое решение не использует две петли, как и другие, поэтому может работать немного быстрее. Если вы хотите избежать использования for..in, вы можете отсортировать оба массива сначала, чтобы повторно проиндексировать все их значения:

Array.prototype.diff = function(arr2) {
    var ret = [];
    this.sort();
    arr2.sort();
    for(var i = 0; i < this.length; i += 1) {
        if(arr2.indexOf(this[i]) > -1){
            ret.push(this[i]);
        }
    }
    return ret;
};

Использование будет выглядеть так:

var array1 = ["cat", "sum","fun", "run", "hut"];
var array2 = ["bat", "cat","dog","sun", "hut", "gut"];

console.log(array1.diff(array2));

Если у вас есть проблема / проблема с расширением прототипа Array, вы можете легко изменить это на функцию.

var diff = function(arr, arr2) {

И вы изменили бы где-нибудь, где func первоначально сказал this на arr2.

37
ответ дан jeremy 22 August 2018 в 09:45
поделиться
  • 1
    .indexOf() просто перемещает контур. Метод проходит внутри целевой массива. ( developer.mozilla.org/en-US/docs/JavaScript/Reference/… [/ д0]) – Jeremy J Starcher 15 September 2012 в 02:16
  • 2
    функция .indexOf(), вероятно, быстрее, чем цикл через весь массив, как это сделано в альтернативе совместимости. – jeremy 15 September 2012 в 02:19
  • 3
    Является ли indexOf () достаточно умным, чтобы использовать двоичный поиск после сортировки? В противном случае это O (N ^ 2), поскольку вы по существу выполняете вложенную петлю из-за того, что indexOf () выполняет линейное сканирование. Даже без этой проблемы, почему возникает линейная стоимость сортировки, когда вы можете сделать это в линейном времени, используя объект в качестве хеш-таблицы? – ChaseMedallion 15 September 2012 в 02:19
  • 4
    Я не слышал ни о каком движке ECMASCript, который переключается на двоичный поиск на отсортированных массивах. Было бы интересной оптимизацией, в том числе с флагом «отсортированный» вокруг с массивом, но мне интересно, достаточно ли для этого вызова. – Jeremy J Starcher 15 September 2012 в 02:22
  • 5
    Это немного поздно, но выглядит как последние версии Chrome, по крайней мере, имеют гораздо более быстрый индексный индекс: jsperf.com/jquery-inarray-vs-underscore-indexof/43 – Andrew Odri 6 February 2015 в 20:20

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

var array1 = ["cat", "sum", "fun", "run"],
    array2 = ["bat", "cat", "dog", "sun", "hut", "gut"];

function getMatch(a, b) {
    var matches = [];

    for ( var i = 0; i < a.length; i++ ) {
        for ( var e = 0; e < b.length; e++ ) {
            if ( a[i] === b[e] ) matches.push( a[i] );
        }
    }
    return matches;
}

getMatch(array1, array2); // ["cat"]
7
ответ дан 0x499602D2 22 August 2018 в 09:45
поделиться

Если ваши значения являются ненулевыми строками или числами, вы можете использовать объект в качестве словаря:

var map = {}, result = [], i;
for (i = 0; i < array1.length; ++i) {
    map[array1[i]] = 1;
}

for (i = 0; i < array2.length; ++i) {
    if (map[array2[i]] === 1) {
        result.push(array2[i]);

        // avoid returning a value twice if it appears twice in array 2
        map[array2[i]] = 0;
    }
}

return result;
0
ответ дан ChaseMedallion 22 August 2018 в 09:45
поделиться
  • 1
    использует 2 петли. лучше, чем другие решения, но вы можете снизить его до 1 – jeremy 15 September 2012 в 02:03

Эта функция работает в O(n log(n) + m log(m)) по сравнению с O(n*m) (как показано в других решениях с циклами / indexOf), которые могут быть полезны, если вы имеете дело со множеством значений.

Однако , потому что ни "a" > 1, ни "a" < 1, это работает только для элементов того же типа.

function intersect_arrays(a, b) {
    var sorted_a = a.concat().sort();
    var sorted_b = b.concat().sort();
    var common = [];
    var a_i = 0;
    var b_i = 0;

    while (a_i < a.length
           && b_i < b.length)
    {
        if (sorted_a[a_i] === sorted_b[b_i]) {
            common.push(sorted_a[a_i]);
            a_i++;
            b_i++;
        }
        else if(sorted_a[a_i] < sorted_b[b_i]) {
            a_i++;
        }
        else {
            b_i++;
        }
    }
    return common;
}

Пример:

var array1 = ["cat", "sum", "fun", "hut"], //modified for additional match
    array2 = ["bat", "cat", "dog", "sun", "hut", "gut"];
intersect_arrays(array1, array2);
>> ["cat", "hut"]
10
ответ дан Community 22 August 2018 в 09:45
поделиться
  • 1
    Сложность на самом деле O (nlogn + mlogm + n + m), вы забыли рассмотреть цикл while при вычислении. – Partha 27 April 2016 в 19:25
  • 2
    @Partha n добавляется более быстрым ростом n logn, то же самое относится к m и m log n. – phant0m 28 April 2016 в 12:13

С некоторыми ES6:

let sortedArray = [];
firstArr.map((first) => {
  sortedArray[defaultArray.findIndex(def => def === first)] = first;
});
sortedArray = sortedArray.filter(v => v);

Этот фрагмент также сортирует firstArr на основе порядка defaultArray

как:

let firstArr = ['apple', 'kiwi', 'banana'];
let defaultArray = ['kiwi', 'apple', 'pear'];
...
console.log(sortedArray);
// ['kiwi', 'apple'];
1
ответ дан ddobby94 22 August 2018 в 09:45
поделиться

Я обнаружил небольшое изменение в отношении того, что @ jota3 предложил работать отлично для меня.

var intersections = array1.filter(e => array2.indexOf(e) !== -1);

Надеюсь, что это поможет!

6
ответ дан Fred Read 22 August 2018 в 09:45
поделиться
  • 1
    Это означает, что вы использовали версию javascript перед ES2016, в которую добавлен (). indexOf () будет работать с любой версией. – jota3 5 April 2018 в 10:01
use lodash 
GLOBAL.utils    = require('lodash')
var arr1 = ['first' , 'second'];
var arr2 = ['second '];

var result = utils.difference (arr1 , arr2);
    console.log ( "result :" + result );
1
ответ дан hanu 22 August 2018 в 09:45
поделиться

Выполнено как ответ, поэтому я могу сделать форматирование ...

Это процесс, который вам нужно пройти. Цитирование через массив для специфики.

create an empty array
loop through array1, element by element. {
  loop through array2, element by element {
    if array1.element == array2.element {
      add to your new array
    }
  }
}
1
ответ дан Jeremy J Starcher 22 August 2018 в 09:45
поделиться
  • 1
    это использует длину массива 1 * длину массива 2 количество циклов ... 24 цикла в этом случае .. было бы лучше просто проверить, является ли индекс значения в массиве 1 существует в массиве2, и тогда будет использоваться только 1 цикл. см. мой ответ. – jeremy 15 September 2012 в 02:07
  • 2
    Я думала об этом. .indexOf() по-прежнему поддерживается не везде, хотя его можно обезвреживать довольно легко ... и .indexOf(), по крайней мере, в версии Mozilla monkeypatch ( developer.mozilla.org/en-US/docs/JavaScript / Reference / & hellip; ) все еще петли. Он просто перемещает одну из петель в функцию indexOf. – Jeremy J Starcher 15 September 2012 в 02:14
  • 3
    Он поддерживается во всех основных браузерах, посмотрите таблицу совместимости ... – jeremy 15 September 2012 в 02:16
  • 4
    Я хорошо знаю, где indexOf есть и не поддерживается. Мой основной указывает, что ваше решение по-прежнему представляет собой двухконтурное решение. Одна из петель просто скрыта. – Jeremy J Starcher 15 September 2012 в 02:20
  • 5
    Правда - но я сомневаюсь, что скорость выполнения - это желаемая цель. Это «Уровень 101», вопрос, поэтому OP нуждается в ответе, который наилучшим образом описывает весь процесс без ярлыков. Понимание точно , что происходит, более важно. – Jeremy J Starcher 15 September 2012 в 02:25

Как упоминал @hanu, вы можете использовать lodash , но вы также можете использовать собственный javascript с:

const intersection = array1.filter(element => array2.includes(element));
13
ответ дан jota3 22 August 2018 в 09:45
поделиться
  • 1
    Это выглядит как самый простой и сжатый ответ. Не уверен, почему он не помечен как правильный. – Burke Holland 15 August 2018 в 11:56
var array1  = [1, 2, 3, 4, 5, 6],
var array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var array3 = array2.filter(function(obj) { 
    return array1.indexOf(obj) == -1; 
});
0
ответ дан jrenk 22 August 2018 в 09:45
поделиться
  • 1
    @Мистер. 1.0 Пожалуйста, изучите этот эффективный и чистый код. – hardik beladiya 16 July 2018 в 10:45
  • 2
    Вы можете объяснить приведенный выше код. – jrenk 16 July 2018 в 11:01

Библиотеки, такие как underscore и lodash, имеют метод утилиты, называемый intersection, чтобы найти совпадения в переданных массивах. Посмотрите на: http://underscorejs.org/#intersection

2
ответ дан leojh 22 August 2018 в 09:45
поделиться
  • 1
    Хорошая точка @ ЭрикЛещинский. Я изменил свой ответ. – leojh 31 March 2016 в 21:02

Итерации на array1 и найдите индекс элемента, присутствующего в array2.

var array1 = ["cat", "sum","fun", "run"];
var array2 = ["bat", "cat","sun", "hut", "gut"];
var str='';
for(var i=0;i<array1.length;i++){
        if(array2.indexOf(array1[i]) != -1){
           str+=array1[i]+' ';
       };
    }
console.log(str)
0
ответ дан Sid Bhalke 22 August 2018 в 09:45
поделиться
  • 1
    Только код просто не имеет смысла. объясните свой ответ, что вы даете OP. – Narendra Jadhav 2 June 2018 в 17:07
Другие вопросы по тегам:

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