Javascript 给定一个对象数组,如何创建一个具有不同键名的新对象数组,同时也省略不需要的数据(ES6方式)?
对不起,标题限制为150个字符 完整代码示例: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 ?
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%;
}
我认为您需要的是首先列出列表,然后在过滤结果上创建新结构。但是,如果列表很大,这可能不会特别有效