Javascript 给定一个对象数组,如何创建一个具有不同键名的新对象数组,同时也省略不需要的数据(ES6方式)?

Javascript 给定一个对象数组,如何创建一个具有不同键名的新对象数组,同时也省略不需要的数据(ES6方式)?,javascript,ecmascript-6,Javascript,Ecmascript 6,对不起,标题限制为150个字符 完整代码示例: let results = []; for (let i=0; i< json.length; i++) { results.push({ user_id: json[i].id, name: json[i].person.data.name, age: json[i].details.age, has_experience: json[i].available ?

对不起,标题限制为150个字符

完整代码示例:

let results = [];

for (let i=0; i< json.length; i++) {

    results.push({
        user_id: json[i].id,
        name: json[i].person.data.name,
        age: json[i].details.age,
        has_experience: json[i].available ? json[i].available : false // here we are assigning a value no matter what using a ternary operator, what if we want no key:value pair here, just skip that pair
    });

    if (json[i].person.data.language) { results[i].language = json[i].person.data.language }
}

console.log(results);

数据:

let results = [];

for (let i=0; i< json.length; i++) {

    results.push({
        user_id: json[i].id,
        name: json[i].person.data.name,
        age: json[i].details.age,
        has_experience: json[i].available ? json[i].available : false // here we are assigning a value no matter what using a ternary operator, what if we want no key:value pair here, just skip that pair
    });

    if (json[i].person.data.language) { results[i].language = json[i].person.data.language }
}

console.log(results);
假设我发出了一个API请求,并返回了这个JSON对象:

[
    {
        id: 123,
        person: {
            data: {
                name: 'John',
                language: 'Javascript'
            }
        },
        details: {
            age: 25
        },
        has_experience: true
    },
    {
        id: 456,
        person: {
            data: {
                name: 'Peter',
                language: null // here we have null as a value.
            }
        },
        details: {
            age: 40
        },
        has_experience: false
    },
    {
        id: 789,
        person: {
            data: {
                name: 'Paul',
                language: 'Python'
            }
        },
        details: {
            age: 30
        },
        has_experience: null // and here we also don't know if the person is available
    },
];
目标:

let results = [];

for (let i=0; i< json.length; i++) {

    results.push({
        user_id: json[i].id,
        name: json[i].person.data.name,
        age: json[i].details.age,
        has_experience: json[i].available ? json[i].available : false // here we are assigning a value no matter what using a ternary operator, what if we want no key:value pair here, just skip that pair
    });

    if (json[i].person.data.language) { results[i].language = json[i].person.data.language }
}

console.log(results);
这里的最终目标是迭代数组,最终得到具有不同键名的对象的新数组。例如,我想用
human
替换
person
的键,或者用
availability
替换
availability
的键

此外(可选)我们希望跳过添加值等于
null
的键

当前解决方案:

let results = [];

for (let i=0; i< json.length; i++) {

    results.push({
        user_id: json[i].id,
        name: json[i].person.data.name,
        age: json[i].details.age,
        has_experience: json[i].available ? json[i].available : false // here we are assigning a value no matter what using a ternary operator, what if we want no key:value pair here, just skip that pair
    });

    if (json[i].person.data.language) { results[i].language = json[i].person.data.language }
}

console.log(results);
let results=[];
for(设i=0;i
问题:

let results = [];

for (let i=0; i< json.length; i++) {

    results.push({
        user_id: json[i].id,
        name: json[i].person.data.name,
        age: json[i].details.age,
        has_experience: json[i].available ? json[i].available : false // here we are assigning a value no matter what using a ternary operator, what if we want no key:value pair here, just skip that pair
    });

    if (json[i].person.data.language) { results[i].language = json[i].person.data.language }
}

console.log(results);
现在我提供的示例和解决方案可以工作了,但是想象一下,如果原始API请求有数百个key:value对,其中许多可能是
null
value

问题:

let results = [];

for (let i=0; i< json.length; i++) {

    results.push({
        user_id: json[i].id,
        name: json[i].person.data.name,
        age: json[i].details.age,
        has_experience: json[i].available ? json[i].available : false // here we are assigning a value no matter what using a ternary operator, what if we want no key:value pair here, just skip that pair
    });

    if (json[i].person.data.language) { results[i].language = json[i].person.data.language }
}

console.log(results);
使用现代javascript,有没有更简洁、更简洁/优雅的方法来处理这个问题

总的来说,我希望在原有对象的基础上创建一个全新的对象数组,但在必要时使用新的键名称。此外,例如,如果键的值为
null
,我们希望跳过添加其中一些

干杯


编辑:

let results = [];

for (let i=0; i< json.length; i++) {

    results.push({
        user_id: json[i].id,
        name: json[i].person.data.name,
        age: json[i].details.age,
        has_experience: json[i].available ? json[i].available : false // here we are assigning a value no matter what using a ternary operator, what if we want no key:value pair here, just skip that pair
    });

    if (json[i].person.data.language) { results[i].language = json[i].person.data.language }
}

console.log(results);
将最初提供的示例中的密钥名称从
available
更改为
has_experience
,因为这有点误导。我不希望根据给定键的值过滤掉对象的原始数组。如果我想这样做,我将从
filter
开始,然后连锁反应


例如,如果key的值为
null
,我想做的是省略在新形成的数组中添加key:value对。

您可以尝试类似的方法

您可以使用
map()

let json=[{id:123,person:{data:{name:'John',language:'Javascript'}},details:{age:25},have_experience:true},
{id:456,person:{data:{name:'Peter',language:null}},详细信息:{age:40},有经验:false},
{id:789,person:{data:{name:'Paul',language:'Python'}},详细信息:{age:30},有经验:null},];
让结果=[];
results=json.map(当前=>{
设温度={
用户id:current.id,
名称:current.person.data.name,
年龄:current.details.age,
}
如果(当前有经验){
temp.Availability=当前有经验
}  
if(当前.个人.数据.语言)
{temp.language=current.person.data.language}
返回温度;
})

控制台日志(结果)您可以尝试类似的方法

您可以使用
map()

let json=[{id:123,person:{data:{name:'John',language:'Javascript'}},details:{age:25},have_experience:true},
{id:456,person:{data:{name:'Peter',language:null}},详细信息:{age:40},有经验:false},
{id:789,person:{data:{name:'Paul',language:'Python'}},详细信息:{age:30},有经验:null},];
让结果=[];
results=json.map(当前=>{
设温度={
用户id:current.id,
名称:current.person.data.name,
年龄:current.details.age,
}
如果(当前有经验){
temp.Availability=当前有经验
}  
if(当前.个人.数据.语言)
{temp.language=current.person.data.language}
返回温度;
})

控制台日志(结果)我认为您需要的是首先列出列表,然后在过滤结果上创建新结构。但是,如果列表很大,这可能不会特别有效

const list=[
{
id:123,
人:{
数据:{
姓名:'约翰',
语言:“Javascript”
}
},
详情:{
年龄:25
},
可用:真
},
{
身份证号码:456,
人:{
数据:{
姓名:'彼得',
语言:null//这里的值为null。
}
},
详情:{
年龄:40
},
可用:false
},
{
id:789,
人:{
数据:{
名字:'保罗',
语言:“Python”
}
},
详情:{
年龄:30
},
available:null//这里我们也不知道此人是否有空
},
];
const newList=list.filter(listItem=>listItem.available).map(filteredItem=>{
返回{
用户id:filteredItem.id,
名称:filteredItem.person.data.name,
年龄:filteredItem.details.age,
可用性:!!filteredItem.available
}
})
document.getElementById('list').innerText=JSON.stringify(list,null,2);
document.getElementById('newList').innerText=JSON.stringify(newList,null,2)
.container{
显示器:flex;
}
.货柜预售{
弹性:0.50%;
}

我认为您需要的是首先列出列表,然后在过滤结果上创建新结构。但是,如果列表很大,这可能不会特别有效