首先,我试图将许多对象的数组合并为单个数组,每个对象中的每个键。
最后,数组中的任何重复项以及任何名为"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()
任何问题,这应该是相当性能的。