如何将一组对象合并为一个数组,然后过滤掉重复的对象



首先,我试图将许多对象的数组合并为单个数组,每个对象中的每个键。

最后,数组中的任何重复项以及任何名为"name"的元素都应该被删除。

输入:

const data = [
{
name: '10/20',
Tyler: 1,
Sonia: 0,
Pedro: 0,
},
{
name: '10/23',
Tyler: 0.5,
Sonia: 0.25,
Pedro: 0.75,
George: 0.5,
},
];

输出:

["Tyler", "Sonia", "Pedro", "George"]

这是我到目前为止所尝试的:

const mergedData = data.reduce((prev, cur) => {
const obj = cur[0];
const keys = Object.keys(obj);
const names = keys.splice(1);
return { names };
}, []);

我正在尝试捕获除"name"以外的任何键名并将其添加到最终数组中。然而,这就是我卡住的地方因为我得到了这个错误,TypeError: Cannot convert undefined or null to object

注意:对象可以是不同长度的,可以包含多个名称,但不能重复。

一个选项是查找放在一个集合中的所有键并删除name

const data = [
{
name: '10/20',
Tyler: 1,
Sonia: 0,
Pedro: 0,
},
{
name: '10/23',
Tyler: 0.5,
Sonia: 0.25,
Pedro: 0.75,
George: 0.5,
},
];
const set = new Set(data.reduce((acc, i) => [...acc, ...Object.keys(i)], []));
set.delete('name');
const result = [...set];
console.log(result);

如果你可以访问ES6方法,你可以使用Set(在创建时确保唯一值)来实现这一点,如果你想通过解构将其转换回数组。

data = [{name: '0', Tyler: '1', Dan: '2', Carl: '3'},  {name: '0', Tyler: '1', Dan: '2', Eric: '3', Danny: '4'}];
const output = (data) => {
let output = [];
// This makes sure you get each array and then strips just the keys as desired
data.forEach(item => {
output = output.
concat(Object.keys(item))
});
// This creates the set, strips our dups, and then spreads itself into an array
return [...new Set(output)]
// Strip out the 'name' key as needed
// NOTE: This should be a param instead of hard-coded, but this is easier to show
.filter(res => res != 'name');
}
console.log(output(data));

考虑到它只导航整个数组一次,并且每个对象本身不应该有数百万个属性导致.keys()任何问题,这应该是相当性能的。