Javascript 将数组的数组与Lodash进行比较

Javascript 将数组的数组与Lodash进行比较,javascript,ecmascript-6,lodash,Javascript,Ecmascript 6,Lodash,我不明白如何从一个数组中提取另一个数组 我尝试使用纯JavaScript(ES6): 我希望最终的openTiles是:[[1,3]],但它没有改变。问题是,上面的代码使用JavaScript的标准比较(==),无法将一个数组与另一个数组进行比较。Lodash有u.isEqual()函数,但我不知道如何实现它 我试过: openTiles = openTiles.filter((item) => { return usedTiles.every((el) => {

我不明白如何从一个数组中提取另一个数组

我尝试使用纯JavaScript(ES6):

我希望最终的openTiles是:[[1,3]],但它没有改变。问题是,上面的代码使用JavaScript的标准比较(==),无法将一个数组与另一个数组进行比较。Lodash有u.isEqual()函数,但我不知道如何实现它

我试过:

openTiles = openTiles.filter((item) => {
    return usedTiles.every((el) => {
        _.isEqual(item, el)
    })
})

但这给了我一个空数组。我想看看人们是如何合并Lodash的u.isEqual()函数的,这样就可以从openTiles中删除所有已使用文件中的数组。

一个简单的方法是将要比较的数组字符串化,以便
.include
能够正常工作:

let openTiles=[[1,1]、[2,2]、[1,3]]
让usedfiles=[[1,1],[2,2]]
const usedTilesStringified=usedTiles.map(JSON.stringify);
openTiles=openTiles.filter((项)=>!UsedFilesString.includes(JSON.stringify(项)))

console.log(openTiles)您可以编写一个特定于您的类型的函数,而不是尝试编写通用对象或数组equals函数,或者使用lodash、Ramda、下划线等函数。如果平铺只是两个元素数组,那么只需编写一个反映这一点的
equals
函数。然后您可以在
部分中使用它:

const tilesEqual=(a)=>(b)=>a[0]==b[0]&&a[1]==b[1]
常量removeTiles=(打开,已使用)=>open.filter(
平铺=>!已使用。一些(平铺相等(平铺))
)
让openTiles=[[1,1],[2,2],[1,3]]
让usedfiles=[[1,1],[2,2]]

log(removeTiles(openTiles,usedfiles))
从另一个lodash中减去一个数组包含一系列不同的方法

由于您案例中的值是数组,因此简单的相等将不起作用,因为
[]!==[]
。Lodash's对两个值进行了深入比较

要将差分减法与
\uu.isEqual()相结合,请选中使用

let openTiles=[[1,1]、[2,2]、[1,3]]
让usedfiles=[[1,1],[2,2]]
openTiles=0.differenceWith(openTiles,UsedFile,0.isEqual)
console.log(openTiles)

和上次你问的一样,看看第一个问题的答案,我仔细阅读了很多遍,我不明白这是怎么回事。我不想。原型阵列。我不知道它是如何应用于我的问题的。你不必在原型上定义一个方法,但是你可以很好地使用相同的通用方法,只是检查每个索引的值是否相同,长度是否相同。我不能很好地使用相同的通用方法。我有一个合理的问题,你一直在推的链接中没有提到。请从我的问题上去掉[duplicate],让我听听愿意尝试帮助我的人的意见。@CertainPerformance:我同意Tachyon80。这是在问一个dup没有回答的真实问题。我将尝试一个答案。简单地
.join(',')
而不是
stringify
-in如何?如果数组包含带逗号的字符串值,该方法可能会返回误报。(或者如果数组包含不同的类型,强制以相同的方式字符串,比如
3
'3'
),我理解这一点,但在当前的问题中它是无效的。在这个例子中,我们只有2个或3个项目的数组。据我所知,这是关于贴图分幅的,如果我们对每个2个数字的数组进行字符串化,可能会导致渲染性能。但我不得不说,斯科特的答案是地图瓷砖的更明智的解决方案。我没有想过这样做。谢谢。我要的是Lodash解决方案,就是这个。它工作得很好。谢谢谢谢你,斯科特。您的顶层解决方案非常有效,不需要额外的库。还感谢您对“退货”声明的建议。问题:在const tilesEqual=(a)=>(b)=>a[0]==b[0]&&a[1]==b[1]中,我看到两个ES6箭头排成一行。这是否意味着a与b相同,并且它们都向a[0]==b[0]代码块发送变量?
openTiles = openTiles.filter((item) => {
    return usedTiles.every((el) => {
        _.isEqual(item, el)
    })
})