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: "

如何以编程方式从Javascript中JSON对象的根中仅获取非数组值的键/值

// 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' } }