Я просто отслеживал эту проблему. Мои симптомы были такими же, как у вас, и я даже пробовал то, что вы пробовали. В итоге моя проблема возникла только потому, что я использовал 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, чтобы он мог выполнять исходящие соединения.
Естественно, мой подход состоял в том, чтобы пропустить первый массив один раз и проверить индекс каждого значения во втором массиве. Если индекс > -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
.
Прокручивайте второй массив каждый раз, когда вы перебираете элемент в первом массиве, затем проверяйте совпадения.
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"]
Если ваши значения являются ненулевыми строками или числами, вы можете использовать объект в качестве словаря:
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;
Эта функция работает в 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"]
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'];
Я обнаружил небольшое изменение в отношении того, что @ jota3 предложил работать отлично для меня.
var intersections = array1.filter(e => array2.indexOf(e) !== -1);
Надеюсь, что это поможет!
use lodash
GLOBAL.utils = require('lodash')
var arr1 = ['first' , 'second'];
var arr2 = ['second '];
var result = utils.difference (arr1 , arr2);
console.log ( "result :" + result );
Выполнено как ответ, поэтому я могу сделать форматирование ...
Это процесс, который вам нужно пройти. Цитирование через массив для специфики.
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
}
}
}
.indexOf()
по-прежнему поддерживается не везде, хотя его можно обезвреживать довольно легко ... и .indexOf()
, по крайней мере, в версии Mozilla monkeypatch ( developer.mozilla.org/en-US/docs/JavaScript / Reference / & hellip; ) все еще петли. Он просто перемещает одну из петель в функцию indexOf
.
– Jeremy J Starcher
15 September 2012 в 02:14
indexOf
есть и не поддерживается. Мой основной i> указывает, что ваше решение по-прежнему представляет собой двухконтурное решение. Одна из петель просто скрыта.
– Jeremy J Starcher
15 September 2012 в 02:20
Как упоминал @hanu, вы можете использовать lodash , но вы также можете использовать собственный javascript с:
const intersection = array1.filter(element => array2.includes(element));
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;
});
Библиотеки, такие как underscore и lodash, имеют метод утилиты, называемый intersection
, чтобы найти совпадения в переданных массивах. Посмотрите на: http://underscorejs.org/#intersection
Итерации на 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)
.indexOf()
просто перемещает контур. Метод проходит внутри целевой массива. ( developer.mozilla.org/en-US/docs/JavaScript/Reference/… [/ д0]) – Jeremy J Starcher 15 September 2012 в 02:16.indexOf()
, вероятно, быстрее, чем цикл через весь массив, как это сделано в альтернативе совместимости. – jeremy 15 September 2012 в 02:19