Javascript,如果语句的字典值等于数组?

时间:2019-02-25 22:31:02

标签: javascript node.js

我对javascript很陌生,由于某种原因,我的程序无法正常工作。我有一本字典,使用的键设置为字符串,而值euqal设置为充满布尔值的数组,即IE:

if (dict[x] == [true, false]) {do something }

但是由于某种原因,当我通过if语句(例如

)运行字典时

{{1}}

它无法触发。我想知道我在做什么错

3 个答案:

答案 0 :(得分:0)

您不能比较复杂的结构,例如数组和对象,因为相等性检查实际上是在查看特定的内存位置。每次创建新对象或数组时,该变量都指向内存中一个新的唯一位置。您将不得不遍历包含原始值的键/索引,并检查每个键/索引是否与您的其他结构相等。

额外的功劳:方括号和花括号分别称为数组文字和对象文字。它们本质上是new Arraynew Object的语法糖。

另外,可以检查字符串,布尔值和数字是否相等的原因是,每种类型(true, false, 7, 'hello world', 'blue', 42)的每个值实际上都指向内存中的唯一位置。例如:当您写

var str = 'yellow'

变量str现在指向内存中与“ yellow”一词组成的六个字符相关联的位置。这是可以进行相等检查的实际原因。

var str2 = 'yel' + 'low'

使用相同的字符组合,从而导致对与str的valueOf函数所指向的内存地址的引用。因此:

str === str2 // true

我希望能有所帮助。这个兔子洞还有很多东西,但这应该可以帮助您入门。

答案 1 :(得分:-1)

  

数组和对象不是基本类型,而是JavaScript中的引用类型。

这意味着在比较数组和对象时,实际上是在将引用与这些实体而不是它们的内容进行比较。当您将此数组分配给另一个变量时,您只是在使该变量引用相同的内容,而没有复制此内容:

const a = [1, 2, 3];
const b = [1, 2, 3];

console.log(a !== b);

const c = a;

console.log(a === c);

c[0] = 10;

console.log(a);

在您的情况下,如果要确保数组包含true后跟false,则可以使用Array.every()或更简单的方法是使用数组索引来检查元素,因为数组很短:

const a = [true, false];

if (a.every((x, i) => x === [true, false][i])) {
  console.log('same content');
}

if (a[0] === true && a[1] === false) {
  console.log('same content');
}

答案 2 :(得分:-1)

使用Array.every

  • 您可以使用Array.every检查数组中的所有项目是否均符合特定条件
  • 这样,您可以检查arrayOne中的所有项目是否都与{{​​1}}中索引i的项目相等

这是一个例子

arrayTwo

使用JSON.stringify

与您的示例配合使用的另一种方法是将对象(“ dicts”)转换为 strings ,然后比较这些 strings 。看起来像这样

const isEqualArrays = (a, b) => a.length === b.length && a.every((x, i) => x === b[i]);
const isEqualDicts = (a, b) => isEqualArrays(a.x, b.x);

const first = { x: [true, false, true] };
const second = { x: [true, false, true] };
const unequal = { x: [true, true, true] };

console.log(isEqualDicts(first, second));
console.log(isEqualDicts(first, unequal));