让我们,我有两个带字符串的数组。
let a = ["ABC", "DEF"]
let b = ["ABC", "DEF", "GHI"]
我想比较上面的两个数组,并制作一个名为 c 的新数组,其中包含以下内容。
c = ["GHI"]
所以,我想比较 a 和 b 数组,并将不相同的元素推送到一个新数组中。
如何在 React Native 中执行此操作?
您可以通过以下步骤执行此操作:
- 首先获取那些不在
b
中的a
元素 - 然后获取那些不在
a
中的b
元素 - 然后
concat()
两个数组。
let a = ["ABC", "DEF"]
let b = ["ABC", "DEF", "GHI"]
const res = a.filter(x => !b.includes(x)).concat(b.filter(x=> !a.includes(x)))
console.log(res)
代码的工作原理
考虑这条线
a.filter(x => !b.includes(x))
filter()
是接受回调的数组方法。如果回调返回true
则元素将被添加到结果数组中,否则不会。
所以现在在上面的代码中x
是数组b
的元素,我们正在迭代它。 如果数组中存在x
b.includes(x)
b
否则false
将返回true
。
!
运算符将true
转换为假和反转
因此,如果x
在b
里面,它将返回true
.因此,通过!
它将变得false
并且false
将从回调返回。因此,元素x
不会包含在结果/过滤数组中。
上一行的句子是"它只得到那些b
中不存在的数组a
项">
第二行
b.filter(x=> !a.includes(x))
获取不在a
中的b
元素。
最后concat()
用于连接两个阵列。
你也可以像这样使用 Array.reduce 和 Array.filter:
const findUniques = (a,b) => [...a,...b].reduce((r,c,i,a) => {
a.filter(x => x===c).length === 1 ? r.push(c) : null
return r
}, [])
console.log(findUniques(["ABC", "DEF"], ["ABC", "DEF", "GHI"]))
console.log(findUniques(["ABC", "DEF"], ["ABC"]))
console.log(findUniques(["ABC", "DEF", "AAA"], ["AAA", "DEF", "GHI"]))
如果您正在使用lodash
这对于xor
来说变得非常微不足道:
console.log(_.xor(["ABC", "DEF"], ["ABC", "DEF", "GHI"]))
console.log(_.xor(["ABC", "DEF"], ["DEF"]))
console.log(_.xor(["ABC", "DEF", "AAA"], ["AAA", "DEF", "GHI"]))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
如果你想防止遍历数组O(n²)次,因为必须在每个数组中搜索重复值,你可以利用JavaScriptObjects
的性能。
const a = ["ABC", "DEF", "JKL"]
const b = ["ABC", "DEF", "GHI"]
const getUniqueValues = (a, b) => {
const uniqueValuesObject = [...a, ...b].reduce((uniqueValuesObject, value) => {
// if the value already exists, then it is not unique
if (uniqueValuesObject[value]) {
uniqueValuesObject[value] = false
} else {
uniqueValuesObject[value] = true
}
return uniqueValuesObject
}, {})
return Object.entries(uniqueValuesObject).reduce((uniqueValues, [value, isUnique]) => {
if (isUnique) {
uniqueValues.push(value)
}
return uniqueValues
}, [])
}
const c = getUniqueValues(a, b)
console.log(c)
这可以通过使用delete
来缩短,但是与上面的解决方案相比,我不确定这是否会导致性能下降。
const a = ["ABC", "DEF", "JKL"]
const b = ["ABC", "DEF", "GHI"]
const getUniqueValues = (a, b) => {
const uniqueValuesObject = [...a, ...b].reduce((uniqueValuesObject, value) => {
// delete if the value already exists
if (uniqueValuesObject[value]) {
delete uniqueValuesObject[value]
} else {
uniqueValuesObject[value] = true
}
return uniqueValuesObject
}, {})
return Object.keys(uniqueValuesObject)
}
const c = getUniqueValues(a, b)
console.log(c)