JS reduce - 只求对象中数组长度的和

4

我有以下数据结构:

const arr = [    
    {key: 0, x: [], y: []},
    {key: 0, x: [], y: []}
]

我想检查所有数组是否为空,我该如何使用reduce实现这一功能?目前我的代码如下:
arr.reduce((count, acc) => {
    return acc !== 'key' ? count + acc.length : count
}, 0)

1
你想要检查哪个属性? - Nina Scholz
你想检查 xy 数组的长度吗? - Maheer Ali
我想要将所有数组的长度相加。 - mtwallet
1
这里的 xy 是否真的是唯一的属性,还是还有其他的数组属性? - Jamiec
1
你想要知道长度还是想知道所有的值是否都为零? - Nina Scholz
6个回答

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

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));


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);


0

您可以在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)


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);

请注意,在其他答案中字符串的长度也被计算在内

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));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接