我具有以下数据结构:
const arr = [
{key: 0, x: [], y: []},
{key: 0, x: [], y: []}
]
我想检查所有数组是否为空,我如何使用reduce做到这一点?到目前为止,我的代码:
arr.reduce((count, acc) => {
return acc !== 'key' ? count + acc.length : count
}, 0)
答案 0 :(得分:3)
您可以将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);
答案 1 :(得分:1)
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));
答案 2 :(得分:1)
由于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);
答案 3 :(得分:0)
您可以在filter()
上使用Object.values
来仅获取数组值。然后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)
答案 4 :(得分:0)
使用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);
请注意,在其他答案中,字符串的长度也计算在内
答案 5 :(得分:0)
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));