Нет простого способа сделать это. Мне тоже это нужно, но мне нужна функция, которая может принимать любые две переменные и проверять равенство. Это включает в себя значения, отличные от объекта, объекты, массивы и любой уровень вложенности.
В вашем вопросе вы указываете на то, что хотите игнорировать порядок значений в массиве. Мое решение по сути не делает этого, но вы можете добиться этого, отсортировав массивы перед сравнением для равенства
. Мне также нужен вариант отливки не-объектов в строки, чтобы [1,2] == = ["1", 2]
Поскольку мой проект использует UnderscoreJs, я решил сделать его mixin, а не автономной функцией.
Вы можете проверить это на http://jsfiddle.net/nemesarial/T44W4/
Вот мой mxin:
_.mixin({
/**
Tests for the equality of two variables
valA: first variable
valB: second variable
stringifyStatics: cast non-objects to string so that "1"===1
**/
equal:function(valA,valB,stringifyStatics){
stringifyStatics=!!stringifyStatics;
//check for same type
if(typeof(valA)!==typeof(valB)){
if((_.isObject(valA) || _.isObject(valB))){
return false;
}
}
//test non-objects for equality
if(!_.isObject(valA)){
if(stringifyStatics){
var valAs=''+valA;
var valBs=''+valB;
ret=(''+valA)===(''+valB);
}else{
ret=valA===valB;
}
return ret;
}
//test for length
if(_.size(valA)!=_.size(valB)){
return false;
}
//test for arrays first
var isArr=_.isArray(valA);
//test whether both are array or both object
if(isArr!==_.isArray(valB)){
return false;
}
var ret=true;
if(isArr){
//do test for arrays
_.each(valA,function(val,idx,lst){
if(!ret){return;}
ret=ret && _.equal(val,valB[idx],stringifyStatics);
});
}else{
//do test for objects
_.each(valA,function(val,idx,lst){
if(!ret){return;}
//test for object member exists
if(!_.has(valB,idx)){
ret=false;
return;
}
// test for member equality
ret=ret && _.equal(val,valB[idx],stringifyStatics);
});
}
return ret;
}
});
Вот как вы его используете:
_.equal([1,2,3],[1,2,"3"],true)
Чтобы продемонстрировать вложенность, вы можете сделать это:
_.equal(
['a',{b:'b',c:[{'someId':1},2]},[1,2,3]],
['a',{b:'b',c:[{'someId':"1"},2]},["1",'2',3]]
,true);
Порт 9300 является двоичным протоколом (не http) и используется для связи узла. Только порт 9200 предоставил Rest Api
Оба клиента Java общаются с кластером через порт 9300, используя собственный транспортный протокол Elasticsearch. Узлы в кластере также связываются друг с другом через порт 9300. Если этот порт не открыт, ваши узлы не смогут сформировать кластер.
BLOCKQUOTE>