Javascript 如何从json根属性中仅获取非数组值
如何以编程方式从Javascript中JSON对象的根中仅获取非数组值的键/值Javascript 如何从json根属性中仅获取非数组值,javascript,json,Javascript,Json,如何以编程方式从Javascript中JSON对象的根中仅获取非数组值的键/值 // sample input { name: "Jackie", age: 26, friends: [ "David", "Ashley" ], pets: [ "Rover" ], birthday: "May 3", family: [ { name: "Lily", relationship: "
// sample input
{
name: "Jackie",
age: 26,
friends: [ "David", "Ashley" ],
pets: [ "Rover" ],
birthday: "May 3",
family: [
{
name: "Lily",
relationship: "Mother"
},
{
name: "Richard",
relationship: "Father"
}
]
}
您可以通过使用
Object.entries()
和Array.prototype.reduce()
来实现
const数据={
姓名:“杰姬”,
年龄:26,,
朋友:[“大卫”、“艾希礼”],
宠物:[“漫游者”],
生日:“五月三日”,
家庭:[
{
姓名:“莉莉”,
关系:“母亲”
},
{
姓名:“理查德”,
关系:“父亲”
}
]
};
const res=Object.entries(data).reduce((acc[key,val])=>(typeof val!='Object'?{…acc[key]:val}:acc),{});
控制台日志(res)代码>使用和使用:
const data={姓名:“Jackie”,年龄:26岁,朋友:[“David”,“Ashley”],宠物:[“Rover”],生日:“5月3日”,家庭:[{姓名:“Lily”,关系:“母亲”},{姓名:“Richard”,关系:“父亲”};
const result=Object.entries(数据)
.filter(([k,v],i)=>!Array.isArray(v))
.减少((a,[k,v])=>{
a[k]=v;
返回a;
}, {});
控制台日志(结果)代码>您对此有何看法:
Object.fromEntries(Object.entries(obj.filter)([k,v])=>Object(v)!==v))
此过期将过滤掉每个具有对象值的键。当然,您可以根据需要自定义此筛选器
Object.fromEntries(Object.entries(obj.filter)([k,v])=>!Array.isArray(v)))
或者像@bramer建议的那样,但是修改原始obj
for(让k在obj中)
if(Array.isArray(obj[k])删除obj[k]
可以包装以返回新的obj
函数justPrimitive(obj,ret={})
for(让k在obj中)
如果(!Array.isArray(obj[k])ret[k]=obj[k]
返回ret;
}
这里是一个简单易读的解决方案,它使用Array.isArray()而不是检查类型是否为对象(由于省略了嵌套对象,因此会导致问题)
const输入={
名字:“杰基”,
年龄:26,,
朋友:[“大卫”,“艾希礼”],
宠物:[“漫游者”],
生日:'5月3日',
家庭:[{
名字:“莉莉”,
关系:“母亲”,
},
{
姓名:'理查德',
关系:“父亲”,
},
],
};
const results={};
对象项(输入)的([键,值]){
如果(!Array.isArray(值)){
结果[关键]=数值;
}
}
console.log('results',results);
一个简单的方法:
let out = {};
Object.entries(inp).forEach(ent => {
const [key, value] = ent;
if (!Array.isArray(value)) {
out[key] = value;
}
});
console.log({ out });
// { out: { name: 'Jackie', age: 26, birthday: 'May 3' } }
const json={
姓名:“杰姬”,
年龄:26,,
朋友:[“大卫”、“艾希礼”],
宠物:[“漫游者”],
生日:“五月三日”,
家庭:[
{
姓名:“莉莉”,
关系:“母亲”
},
{
姓名:“理查德”,
关系:“父亲”
}
]
}
Object.filter=(对象,谓词)=>
对象键(obj)
.filter(key=>谓词(obj[key]))
.reduce((res,key)=>(res[key]=obj[key],res),{});
var filtered=Object.filter(json,item=>{
返回项目类型!=“对象”?真:假
});
console.log(已筛选);
在属性上循环。如果属性的类型是对象,请删除该属性。typeof val!=“object”
将排除对象和数组。!Array.isArray(val)
是一个更正确的测试。数组是对象的类型和数组的实例。因此它是合适的。如果数据对象的任何值都是对象而不是数组,该怎么办?OP需要所有“非数组值”。您的测试排除了数组对象和非数组对象。它排除的值比请求的值多。答案不仅适用于OP,也适用于稍后访问此测试的其他人。因此,为什么不修复您的答案以避免混淆?
let out = {};
Object.entries(inp).forEach(ent => {
const [key, value] = ent;
if (!Array.isArray(value)) {
out[key] = value;
}
});
console.log({ out });
// { out: { name: 'Jackie', age: 26, birthday: 'May 3' } }