包含字符串和数字的两个数组之间的区别

时间:2019-02-27 04:35:14

标签: javascript arrays typescript

我能够找到一个数组与另一个数组之间的差异(请参见ac之间的比较)。但是问题是数组是否在一个数组中包含一个数字。我尝试执行以下操作:b.forEach(el=>{el.toString();});a.forEach(el=>{parseInt(el, 10);});无济于事。

var a= ["473", "204"];
var b= [473, 204]; //problem is if number with string
var c= ["473", "204"];

console.log(a.filter(function (n) { return !this.has(n); }, new Set(b)));
console.log(a.filter(function (n) { return !this.has(n); }, new Set(c)));

b.forEach(el=>{el.toString();});
console.log(a.filter(function (n) { return !this.has(n); }, new Set(b)));

a.forEach(el=>{parseInt(el, 10);});
console.log(a.filter(function (n) { return !this.has(n); }, new Set(b)));

我想问问是否有一种方法可以区分两个包含不同类型且值相同的数组?

背景:检索到的数组之一来自元素id,另一个来自查询。

5 个答案:

答案 0 :(得分:3)

您可以将Set中的数组map设为数字,然后在使用has方法时,可以使用unary + operator将字符串强制为数字:

var a= ["473", "204"];
var b= [473, 204]; //problem is if number with string
var c= ["473", "204"];

var resB = a.filter(function (n) { return !this.has(+n); }, new Set(b.map(Number)));
var resC = a.filter(function (n) { return !this.has(+n); }, new Set(c.map(Number)));

console.log(resB);
console.log(resC);

答案 1 :(得分:1)

您的

b.forEach(el=>{el.toString();});

a.forEach(el=>{parseInt(el, 10);});

根本不执行任何操作-您正在使用该项目的字符串或数字表示形式创建一个表达式,然后对该表达式不执行任何操作。原始数组保持不变。

要更改原始数组,您必须明确分配给它,例如

a.forEach((el, i) => {
  a[i] = parseInt(el, 10)

或更妙的是使用Array.prototype.map

var a= ["473", "204"];
var b= [473, 204]; //problem is if number with string
var c= ["473", "204"];

const aNums = a.map(Number);
console.log(aNums.filter(function (n) { return !this.has(n); }, new Set(b)));

答案 2 :(得分:1)

使用typeof

console.log(typeof 42);
// expected output: "number"

console.log(typeof 'blubber');
// expected output: "string"

console.log(typeof true);
// expected output: "boolean"

console.log(typeof declaredButUndefinedVariable);
// expected output: "undefined";

答案 3 :(得分:1)

另一种可能的解决方案是检查集合中是否不包含n作为数字(+n)或n作为字符串(n.toString()):

var a = ["473", "204"];
var b = [473, 204]; //problem is if number with string
var c = ["473", "204"];
var d = [473, "199", 175];

console.log(
   a.filter(function(n)
   {
       return !(this.has(+n) || this.has(n.toString()));
   }, new Set(b))
);
console.log(
    a.filter(function(n)
    {
       return !(this.has(+n) || this.has(n.toString()));
    }, new Set(c))
);
console.log(
    a.filter(function(n)
    {
       return !(this.has(+n) || this.has(n.toString()));
    }, new Set(d))
);
.as-console {background-color:black !important; color:lime;}

无需使用Set,就可以进行 Array.some() == 比较。

var a = ["473", "204"];
var b = [473, 204]; //problem is if number with string
var c = ["473", "204"];
var d = [473, "199", 175];

console.log(a.filter(n => !b.some(x => x == n)));
console.log(a.filter(n => !c.some(x => x == n)));
console.log(a.filter(n => !d.some(x => x == n)));
.as-console {background-color:black !important; color:lime;}

答案 4 :(得分:0)

您可以对类型强制使用double equals(也称为Abstract Equality比较)运算符:

console.log(473 == '473') // true

MDN reference on JS equality comparisons