我有以下数据结构:
const arr = [
{key: 0, x: [], y: []},
{key: 0, x: [], y: []}
]
我想检查所有数组是否为空,我该如何使用reduce实现这一功能?目前我的代码如下:
arr.reduce((count, acc) => {
return acc !== 'key' ? count + acc.length : count
}, 0)
我有以下数据结构:
const arr = [
{key: 0, x: [], y: []},
{key: 0, x: [], y: []}
]
arr.reduce((count, acc) => {
return acc !== 'key' ? count + acc.length : count
}, 0)
key
取出,并检查其长度是否为零。
const
array = [{ key: 0, x: [], y: [] }, { key: 0, x: [], y: [] }],
allZero = array.every(({ key, ...o }) =>
Object.values(o).every(({ length }) => !length));
console.log(allZero);
求和
const
array = [{ key: 0, x: [], y: [] }, { key: 0, x: [], y: [] }],
sum = array.reduce((s, { key, ...o }) =>
Object.values(o).reduce((t, { length }) => t + length, s), 0);
console.log(sum);
reduce
有些笨重,而且你正在循环遍历数组中的项,而不是键(我认为)你期望的。
改用Array.every
:
const arr = [
{key: 0, x: [], y: []},
{key: 0, x: [], y: []}
]
const arr2 = [
{key: 0, x: [1,2,3], y: []},
{key: 0, x: [], y: []}
]
function areAllEmpty(a){
return a.every(i => i.x.length == 0 && i.y.length == 0);
}
console.log(areAllEmpty(arr));
console.log(areAllEmpty(arr2));
因为acc
将是数组中的对象,所以您应该检查对象属性是否为数组。为此,请使用Object.values
,以及另一个reduce
用于每个对象内部的数组,并排除key
:
const arr = [
{key: 0, x: [], y: []},
{key: 0, x: [], y: []}
];
const res = arr.reduce((a, { key, ...c }) => a + Object.values(c).reduce((e, { length: f }) => e + f, 0), 0);
console.log(res);
您可以在Object.values
上使用filter()
来获取仅数组值。然后使用flat()
并将长度添加到结果中。
const arr = [
{key: 0, x: [], y: []},
{key: 0, x: [], y: []}
]
let res = arr.reduce((count, acc) => {
return count + Object.values(acc).filter(x => x.constructor === Array).flat().length
}, 0)
console.log(res)
使用Array.reduce()
仅对数组长度求和:
const arr = [
{key: 0, x: [], y: [], abc: "hsgg" },
{key: 0, x: [1, 2, 3, 4], y: [1, 2]}
];
const c = arr.reduce((count, obj) => {
Object.values(obj).forEach(v => {
if(Array.isArray(v)) count += v.length;
});
return count;
}, 0);
console.log(c);
Array.every
是更好的选择。您可以遍历对象的所有值并测试它们是否为数组,如果是,则返回false
(如果它们不为空)。every
将在找到非空数组或迭代结束时立即停止。
const arr = [
{key: 0, x: [], y: []},
{key: 0, x: [], y: []}
];
const arr2 = [
{key: 0, x: [], y: [1]},
{key: 0, x: [], y: []}
];
const allEmpty = (arr) => arr.every(el => {
for (let v of Object.values(el)) {
if (Array.isArray(v) && v.length > 0) return false;
}
return true;
});
console.log(allEmpty(arr));
console.log(allEmpty(arr2));
x
和y
数组的长度吗? - Maheer Alix
和y
是否真的是唯一的属性,还是还有其他的数组属性? - Jamiec