假设我有以下数组比较函数:
function cmp_arrs(a, b) {
if (a === b) return true;
if (a.length != b.length) return false;
for (let i=0; i < a.length; i++)
if (a[i] != b[i]) return false;
return true;
}
我怎么能把这个——特别是for
循环——转换成单行javascript箭头函数呢?到目前为止,我有:
const cmp_arrs2 = (a,b) => (a === b) || ((a.length === b.length) && (<forLoop?>))
我目前的方法是将其字符串化,看看是否有效,但这似乎有点粗糙/错误:
const cmp_arrs2 = (a,b) => (a === b) || ((a.length === b.length)
&& (Object.values(a).toString() == Object.values(b).toString()))
可以使用高阶函数,如.every()
。为了让.every()
返回true
,回调必须为每个项目返回true
,如果它为任何项目返回false
,那么.every()
将导致false
。您可以使用回调的第二个参数来获取索引i
,以便从数组b
中获取相应的元素:
const cmp_arrs2 = (a,b) =>
a === b || a.length === b.length && a.every((elem, i) => elem === b[i]);
&&
具有比||
更高的运算符优先级,因此如果您愿意,也可以省略分组()
。
您可以这样做:
// Create a Separate Function
const cmp_loop = (a, b) => {
for (let i=0; i < a.length; i++)
if (a[i] != b[i]) return false;
return true;
}
// Now make a single line function
const cmp_array = (a, b) => (a === b) || ((a.length === b.length) && cmp_loop(a, b))
// You can also do this:
const cmp_array_2 = (a, b) => (a === b) || ((a.length === b.length) && a.reduce((equal, current, index) => !equal ? equal : current === b[index], true))
// Another quick way (If you are sure that the elements in both arrays are on same positions or indexes):
const cmp_array_3 = (a, b) => JSON.stringify(a) === JSON.stringify(b);