gpt4 book ai didi

javascript - 嵌套数组的 include() 方法

转载 作者:行者123 更新时间:2023-11-30 11:08:54 25 4
gpt4 key购买 nike

我正在努力检查数组中的数组。 include() 方法似乎不是为它设计的,因为在这种情况下它总是返回 false。下面是与 indexOf 相同的场景示例。也许我只需要语法帮助,欢迎任何想法。

arr = [1,[9,9],3,4,5];

if (arr.indexOf(el) !== -1) {
console.log(`the array contains ${el}`);
} else {
console.log(`doesn't contain ${el}`);
}

当然,上面的 1、3、4、5 返回 true,2 返回 false。现在问题来了。我正在尝试使用 [9,9] 之类的数组来提供此方法,以查看是否已经存在。

let el = [9,9];
// console: "doesn't contain 9,9"

另一方面,下面的内容没问题,这让我认为这只是一个语法问题(?)

let el = arr[1];
// console: "the array contains 9,9"

我通过使用 for 循环编写一个检查器函数找到了解决它的方法,但是随着您添加需求,这很快就会变得庞大。我很想知道更聪明的方法。

谢谢。

最佳答案

您遇到的问题是数组是引用类型。因此,只有当两个数组引用相同的底层数组时,比较两个数组才会返回 true,而对于不同的数组,即使它们包含相同的值,也会返回 false。

const arr1 = [1, 2];
const arr2 = [1, 2];
const arr3 = arr1;

console.log(arr1 === arr3);
console.log(arr1 !== arr2);

要解决您的问题,您的include 函数需要按值比较(深度比较),您可以简单地使用JSON.stringify().

This method is fast but limited, it works when you have simple JSON-style objects without methods and DOM nodes inside

查看此 SO post关于 JavaScript 中的对象比较。

这是一个工作示例:

function include(arr, value) {
const stringifiedValue = JSON.stringify(value);
for (const val of arr) {
if (JSON.stringify(val) === stringifiedValue) {
return true;
}
}
return false;
}

console.log(include([1, 2, 3, 4], 3));
console.log(include([1, 2, 3, [1, 2]], [1, 2]));
console.log(include([1, 2, 3, [1, 2]], [1, 2, 3]));

这是在不使用 JSON.stringify() 的情况下进行深度比较的另一种方法,它适用于内部数组和标量值:

function include(arr, value) {
const valArity = Array.isArray(value) ? value.length : 1;
for (let item of arr) {
if (valArity > 1 && Array.isArray(item) && item.length === valArity) {
if (item.every((val, i) => val === value[i])) {
return true;
}
} else if (item === value) {
return true;
}
}
return false;
}

console.log(include([1, 2, 3, 4], 3));
console.log(include([1, 2, 3, [1, 2]], [1, 2]));
console.log(include([1, 2, 3, [1, 2]], [1, 2, 3]));
console.log(include([1, 2, 'abc', 4], 'abc'));

这里是一个修改版本,适用于具有标量属性、数组和标量的简单对象:

function include(arr, value) {
const valArity = Array.isArray(value) ? value.length : 1;
const isObject = value instanceof Object;
for (let item of arr) {
if (valArity > 1 && Array.isArray(item) && item.length === valArity) {
if (item.every((val, i) => val === value[i])) {
return true;
}
} else if (isObject && item instanceof Object && item) {
const numEntries = Object.keys(value).length;
const entries = Object.entries(item);
if (numEntries === entries.length) {
if (entries.every(([k, v]) => value[k] === v)) {
return true;
}
}
} else if (item === value) {
return true;
}
}
return false;
}

console.log(include([1, 2, 3, 4], 3));
console.log(include([1, 2, 3, [1, 2]], [1, 2]));
console.log(include([1, 2, 3, [1, 2]], [1, 2, 3]));
console.log(include([1, 2, { a: 1 }, 4], { a: 1 }));
console.log(include([1, 2, { a: 1, b: 2 }, 4], { a: 1 }));
console.log(include([1, 2, 'abc', 4], 'abc'));

关于javascript - 嵌套数组的 include() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54544565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com