我尝试将对象数组中的所有键写为新数组,该对象的值是数组。没有重复。 没有像lodash或下划线这样的库的javascript中最好的方法是什么。我认为我的解决方案绝对是可改进的。单个对象及其键是可变的,并不总是相同的。 欢迎提出建议。
示例的预期输出为: [ “东西”, “类型”, “杂项”, “东西” ]
const items = [{
name: "Joe",
occupied: "no",
mobile: "yes",
treatment: "no",
date: "29-03-2020",
age: "15",
stuff: ["A", "B", "C"],
type: ["1", "2"]
},
{
name: "Jack",
occupied: "yes",
mobile: "no",
treatment: "no",
date: "02-03-2020",
age: "20",
stuff: ["A", "B", "C", "D", "E"],
type: ["8", "6"],
misc: ["otherStuff", "someStuff"]
},
{
name: "Jane",
occupied: "no",
mobile: "yes",
treatment: "yes",
date: "15-02-2020",
age: "28",
stuff: ["C", "D", "E"],
type: ["4", "7"],
something: ["xxx", "ccc"]
}
];
function getKeysWithArrayValues(myArray) {
const result = [];
myArray.forEach(item => Object.entries(item).forEach(itm => itm.filter(Array.isArray).forEach(x => result.push(itm.slice(0, 1)))));
return flatArray(result)
};
function flatArray(array) {
return array.reduce((acc, val) => Array.isArray(val) ? acc.concat(flatArray(val)) : acc.concat(val), []);
};
const ttt = getKeysWithArrayValues(items);
const flat = Array.from(new Set(ttt))
console.log(flat);
答案 0 :(得分:2)
这是我的解决方案,希望对您有所帮助。该算法非常清楚,我想不需要过多说明。我们只是使用reduce方法遍历一个数组,最后构建仅包含符合我们要求的键的新数组。
Array.isArray(rec [key])检查value是否是一个数组。
acc.indexOf(key)<0检查是否已通过以下步骤之一将键包含到结果数组中。
const arr_ = items
.reduce((acc, rec) => {
return [...acc, ...Object.keys(rec).filter(key => Array.isArray(rec[key]) && acc.indexOf(key) < 0)]
}, [])
答案 1 :(得分:1)
使用flatMap
遍历每个对象的键并返回过滤后的键数组,条件是该键的值是否为数组:
const items=[{name:"Joe",occupied:"no",mobile:"yes",treatment:"no",date:"29-03-2020",age:"15",stuff:["A","B","C"],type:["1","2"]},{name:"Jack",occupied:"yes",mobile:"no",treatment:"no",date:"02-03-2020",age:"20",stuff:["A","B","C","D","E"],type:["8","6"],misc:["otherStuff","someStuff"]},{name:"Jane",occupied:"no",mobile:"yes",treatment:"yes",date:"15-02-2020",age:"28",stuff:["C","D","E"],type:["4","7"],something:["xxx","ccc"]}];
const keysWithArrays = new Set(
items.flatMap(
item => Object.keys(item).filter(key => Array.isArray(item[key]))
)
);
console.log([...keysWithArrays]);
答案 2 :(得分:1)
您可以使用Set
并获得对象的唯一键。
const
items = [{ name: "Joe", occupied: "no", mobile: "yes", treatment: "no", date: "29-03-2020", age: "15", stuff: ["A", "B", "C"], type: ["1", "2"] }, { name: "Jack", occupied: "yes", mobile: "no", treatment: "no", date: "02-03-2020", age: "20", stuff: ["A", "B", "C", "D", "E"], type: ["8", "6"], misc: ["otherStuff", "someStuff"] }, { name: "Jane", occupied: "no", mobile: "yes", treatment: "yes", date: "15-02-2020", age: "28", stuff: ["C", "D", "E"], type: ["4", "7"], something: ["xxx", "ccc"] }],
keys = Array.from(
items.reduce(
(s, o) => Object
.keys(o)
.reduce((t, k) => Array.isArray(o[k]) ? t.add(k) : t, s),
new Set
)
);
console.log(keys);
答案 3 :(得分:1)
您可以使用set和Array.isArray()来检查值是否为数组。
let mySet = new Set(); const items = [{name: "Joe",occupied: "no",mobile: "yes",treatment: "no",date: "29-03-2020",age: "15",stuff: ["A", "B", "C"],type: ["1", "2"]},{name: "Jack",occupied: "yes",mobile: "no",treatment: "no",date: "02-03-2020",age: "20",stuff: ["A", "B", "C", "D", "E"],type: ["8", "6"],misc: ["otherStuff", "someStuff"]
}, {name: "Jane",occupied: "no",mobile: "yes",treatment: "yes",date: "15-02-2020",age: "28",stuff: ["C", "D", "E"],type: ["4", "7"],something: ["xxx", "ccc"]}];
items.forEach((obj)=> Object.keys(obj).forEach( prop=>{if(Array.isArray(obj[prop]))
mySet.add(prop)})); console.log(Array.from(mySet));
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 4 :(得分:1)
使用Object.fromEntries
,flatMap
和filter
的另一种方式。
const items = [
{
name: "Joe",
occupied: "no",
mobile: "yes",
treatment: "no",
date: "29-03-2020",
age: "15",
stuff: ["A", "B", "C"],
type: ["1", "2"]
},
{
name: "Jack",
occupied: "yes",
mobile: "no",
treatment: "no",
date: "02-03-2020",
age: "20",
stuff: ["A", "B", "C", "D", "E"],
type: ["8", "6"],
misc: ["otherStuff", "someStuff"]
},
{
name: "Jane",
occupied: "no",
mobile: "yes",
treatment: "yes",
date: "15-02-2020",
age: "28",
stuff: ["C", "D", "E"],
type: ["4", "7"],
something: ["xxx", "ccc"]
}
];
const keys = Object.keys(
Object.fromEntries(
items.flatMap(item =>
Object.entries(item).filter(([, value]) => Array.isArray(value))
)
)
);
console.log(keys);