我试图在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;]
这可能令人沮丧地简单。但是我已经尝试了几种不同的组合来成功地比较两个字符串....不成功。
答案 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
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)
}