测试两个字符串是否相等会产生奇怪的结果

时间:2017-02-24 15:28:47

标签: javascript

我试图在javascript中比较两个列表。如果ListA中存在不在ListB中的内容 - 我想将其推送到ListB。如果它存在,我不想做任何事情。列表中的项目是字符串。

当我检查一个字符串是否与另一个字符串相等时,我得到了非常奇怪的结果。这是我的JS:

function assignColor() {
    var test = ["JackBean", "MrX", "SuperMan", "BobHemsworth", "SomeoneElse", "AnotherSomeone"]
    var list_existing = ["JackBean", "MrX", "SuperMan", "BobHemsworth"];
    length_of_existing = list_existing.length;

    i=0;
    while ( i < test.length ) {
        var person_in_list = test[i]

        for ( var j=0; j <= parseInt(length_of_existing); j++) {

            if ( person_in_list === list_existing[j]) {
                console.log("equal");
            }
            else {
                console.log("not equal");
                list_existing.push(person_in_list);
            }
        }
    ++i;
    }
    console.log(list_existing);
}

我为list_existing获得的输出如下:

  

[&#34; JackBean&#34;,&#34; MrX&#34;,&#34; SuperMan&#34;,&#34; BobHemsworth&#34;,&#34; JackBean&#34;,& #34; JackBean&#34;,&#34; MrX&#34;,&#34; SuperMan&#34;,&#34; BobHemsworth&#34;]

这可能令人沮丧地简单。但是我已经尝试了几种不同的组合来成功地比较两个字符串....不成功。

7 个答案:

答案 0 :(得分:1)

使用Set可以很容易地做到这一点,它根据定义包含唯一值 - 所以你要做的就是连接两个数组,用它们创建一个新的Set,然后你得到了结果:

var test = ["JackBean", "MrX", "SuperMan", "BobHemsworth", "SomeoneElse", "AnotherSomeone"]
var list_existing = ["JackBean", "MrX", "SuperMan", "BobHemsworth"];

let set = new Set(list_existing.concat(test));
let result = [...set];
console.log(result);

答案 1 :(得分:1)

您的问题存在于if/else条件

基本上,当你发现一个平等时,你不应该继续迭代list_existing你应该停止并继续while循环。

所以我的想法是修改for ( var j=0; j <= parseInt(length_of_existing); j++)

for ( var j=0; j <= parseInt(length_of_existing) && notFound; j++)

和notFound初始化为true,并在找到相等时变为false。

答案 2 :(得分:1)

好的,所以你正在做的是检查每个元素与其他所有元素。这意味着当杰克与杰克相比时,没有任何反应,但是你将杰克与MrX进行比较,它认为杰克需要加入。

通过查看整个数组而不是单个元素来解决此问题。

a/c/b

JSFiddle

function assignColor() { var test = ["JackBean", "MrX", "SuperMan", "BobHemsworth", "SomeoneElse", "AnotherSomeone"] var list_existing = ["JackBean", "MrX", "SuperMan", "BobHemsworth"]; length_of_existing = list_existing.length; i=0; while ( i < test.length ) { var person_in_list = test[i] if (list_existing.indexOf(test[i]) === -1) { //not found list_existing.push(test[i]); //add the missing element } ++i; } console.log(list_existing); } 查看该值是否已存在并返回索引(如果存在)。您需要小心这一点,因为您可以将array.indexOf作为有效结果(数组中的索引0是您知道的第一个)。 0使用array.indexOf作为-1 / not-found解决了此问题。这就是我必须在if语句中指定而不是仅仅对结果进行布尔化的原因。

答案 3 :(得分:1)

问题出在for循环定义的第二个语句中:它表示j <= parseInt(length_of_existing)但它应该说j < parseInt(length_of_existing),因为如果使用&lt; =,则循环将运行一次额外的时间。在额外的时间内,当前索引(4)中的元素将是未定义的,因此,下面的if语句将计算为false。

答案 4 :(得分:0)

做这样的事情怎么样?

function assignColor() {
    var test = ["JackBean", "MrX", "SuperMan", "BobHemsworth", "SomeoneElse", "AnotherSomeone"]
    var list_existing = ["JackBean", "MrX", "SuperMan", "BobHemsworth"];


    test.forEach(item => {
        if(!~list_existing.indexOf(item)){
            list_existing.push(item);
        }
    });
    console.log(list_existing);
}

assignColor();

只需循环第一个数组并使用简单的“indexOf”检查第二个数组中是否存在项目:)

编辑:baao有更好的解决方案

答案 5 :(得分:0)

这会简单得多:

var test = ['a', 'b', 'c'];
var list_existing = ['b', 'd'];

test.forEach(function(el) {
  if (list_existing.indexOf(el) === -1) {
      list_existing.push(el);
  }
});

答案 6 :(得分:0)

您可以使用包含功能

轻松完成
function assignColor()
{

var a = ["JackBean", "MrX", "SuperMan", "BobHemsworth", "SomeoneElse", "AnotherSomeone"];
var b = ["JackBean", "MrX", "SuperMan", "BobHemsworth"];

             for(var j=0; j < a.length; j++) {

            if( b.includes(a[j])) alert("contain")  

            else b.push(a[j]);

    }
console.log(b)
}