Javascript 获取值为数组的对象数组中的所有键

Javascript 获取值为数组的对象数组中的所有键,javascript,arrays,json,object,Javascript,Arrays,Json,Object,我尝试将值为数组的对象数组中的所有键写入新数组。没有副本。 在javascript中,没有lodash或下划线等库的最佳方式是什么。我认为我的解决方案绝对是可以改进的。单个对象及其关键点是可变的,并不总是相同的。 欢迎提出建议 我的示例中的预期输出应该是: [ “东西”, “类型”, “杂项”, “什么” ] const项=[{ 姓名:“乔”, “没有”, 手机:“是”, 治疗:“不”, 日期:“29-03-2020”, 年龄:"十五岁",, 资料:[“A”、“B”、“C”], 类型:[“1”

我尝试将值为数组的对象数组中的所有键写入新数组。没有副本。 在javascript中,没有lodash或下划线等库的最佳方式是什么。我认为我的解决方案绝对是可以改进的。单个对象及其关键点是可变的,并不总是相同的。 欢迎提出建议

我的示例中的预期输出应该是: [ “东西”, “类型”, “杂项”, “什么” ]

const项=[{
姓名:“乔”,
“没有”,
手机:“是”,
治疗:“不”,
日期:“29-03-2020”,
年龄:"十五岁",,
资料:[“A”、“B”、“C”],
类型:[“1”、“2”]
},
{
姓名:“杰克”,
“是的”,
手机:“否”,
治疗:“不”,
日期:“2020年3月2日”,
年龄:"20岁",,
资料:[“A”、“B”、“C”、“D”、“E”],
类型:[“8”、“6”],
杂项:[“其他材料”、“某些材料”]
},
{
姓名:“简”,
“没有”,
手机:“是”,
治疗:“是”,
日期:“15-02-2020”,
年龄:"28岁",,
材料:[“C”、“D”、“E”],
类型:[“4”、“7”],
某物:[“xxx”,“ccc”]
}
];
函数GetKeyswithArrayValue(myArray){
常量结果=[];
myArray.forEach(item=>Object.entries(item.forEach)(itm=>itm.filter(Array.isArray.forEach)(x=>result.push(itm.slice(0,1 ')));
返回平面阵列(结果)
};
函数平面阵列(阵列){
返回数组.reduce((acc,val)=>array.isArray(val)?acc.concat(flatary(val)):acc.concat(val),[]);
};
const ttt=getKeyswithArrayValue(项);
常数平坦=数组。从(新集合(ttt))

控制台。原木(平)
使用
flatMap
迭代每个对象的键并返回一个经过过滤的键数组,条件是该键处的值是否为数组:

const items=[{name:“Joe”,accounted:“no”,treatment:“no”,date:“29-03-2020”,age:“15”,stuff:[“A”,“B”,“C”],type:[“1”,“2”]},{name:“Jack”,accounted:“yes”,mobile:“no”,treatment:“no”,date:“02-03-2020”,age:“20”,stuff:[“A”,“B”,“C”,“D”,“E”],type:[“8”,“6”],misc:[“otherStuff”,“sometuff”},{name:“Jane”,accounted:“no”,mobile:“no”,treatment:“yes”,treatment:“是”,日期:“15-02-2020”,年龄:“28”,材料:[“C”,“D”,“E”],类型:[“4”,“7”],材料:[“xxx”,“ccc”}];
const keysWithArrays=新集合(
items.flatMap(
item=>Object.keys(item.filter)(key=>Array.isArray(item[key]))
)
);
log([…keysWithArrays])您可以选择一个并获取对象的唯一键

const
物品=[{姓名:“乔”,占用:“否”,移动:“是”,治疗:“否”,日期:“29-03-2020”,年龄:“15”,物品:[“A”,“B”,“C”],类型:[“1”,“2”]},{姓名:“杰克”,占用:“是”,移动:“否”,治疗:“否”,日期:“02-03-2020”,年龄:“20”,物品:[“A”,“B”,“C”,“D”,“E”],类型:[“8”,“6”],杂项:[“其他物品”,“某些物品”},{姓名:“简”,职业:“否”,手机:“是”,治疗:“是”,日期:“15-02-2020”,年龄:“28”,物品:[“C”,“D”,“E”],类型:[“4”,“7”],物品:[“xxx”,“ccc”]},
keys=Array.from(
减少(
(s,o)=>对象
.钥匙(o)
.reduce((t,k)=>Array.isArray(o[k])?t.add(k):t,s),
新集
)
);

控制台日志(键)您可以使用set和Array.isArray()检查值是否为Array

让mySet=newset();const items=[{name:“Joe”,accounted:“no”,mobile:“yes”,treatment:“no”,date:“29-03-2020”,age:“15”,stuff:[“A”,“B”,“C”],type:[“1”,“2”],{name:“Jack”,accounted:“yes”,mobile:“no”,treatment:“no”,date:“02-03-2020”,age:“20”,stuff:[“A”,“B”,“C”,“C”,“D”,“E”],type:[“8”,“6”],misc:[“otherStuff”,“sometuff”]
},{姓名:“简”,职业:“否”,手机:“是”,治疗:“是”,日期:“15-02-2020”,年龄:“28”,材料:[“C”,“D”,“E”],类型:[“4”,“7”],某物:[“xxx”,“ccc”}];
items.forEach((obj)=>Object.keys(obj).forEach(prop=>{if(Array.isArray)(obj[prop]))
mySet.add(prop)});log(Array.from(mySet))

.as控制台包装{max height:100%!important;top:0;}
这是我的解决方案,希望对您有所帮助。算法非常清晰,我想不需要解释太多。我们只需使用reduce方法遍历一个数组,最后构建一个只包含符合我们需求的键的新数组

isArray(rec[key])检查值是否为数组

acc.indexOf(键)<0检查键是否已包含在previos步骤之一的结果数组中

const arr_ = items
  .reduce((acc, rec) => {
    return [...acc, ...Object.keys(rec).filter(key => Array.isArray(rec[key]) && acc.indexOf(key) < 0)]
  }, [])
const arr=项目
.减少((acc,rec)=>{
return[…acc,…Object.keys(rec).filter(key=>Array.isArray(rec[key])&acc.indexOf(key)<0)]
}, [])

使用
对象的另一种方式。从条目
平面图
过滤器

const项=[
{
姓名:“乔”,
“没有”,
手机:“是”,
治疗:“不”,
日期:“29-03-2020”,
年龄:"十五岁",,
资料:[“A”、“B”、“C”],
类型:[“1”、“2”]
},
{
姓名:“杰克”,
“是的”,
手机:“否”,
治疗:“不”,
日期:“2020年3月2日”,
年龄:"20岁",,
资料:[“A”、“B”、“C”、“D”、“E”],
类型:[“8”、“6”],
杂项:[“其他材料”、“某些材料”]
},
{
姓名:“简”,
“没有”,
手机:“是”,
治疗:“是”,
日期:“15-02-2020”,
年龄:"28岁",,
材料:[“C”、“D”、“E”],
类型:[“4”、“7”],
某物:[“xxx”,“ccc”]
}
];
const keys=Object.keys(
Object.fromEntries(
items.flatMap(item=>
Object.entries(item).filter(([,value])=>Array.isArray(value))
)
)
);

控制台日志(键)请添加您的解决方案。@nina编辑的可运行代码段的代码flatmap还不是实验性的吗?它的语法和操作已经标准化了,并且是可运行的。它肯定会成为官方语言的一部分,我不认为它是实验性的。为了与旧浏览器兼容,您可以使用polyfill。我最喜欢它,因为它简洁;)