Javascript 我的对象是否返回隐藏的';空';价值

Javascript 我的对象是否返回隐藏的';空';价值,javascript,Javascript,我的代码似乎返回一个未在对象中显式声明的空值 我试图编写的是一个代码,它将遍历一个对象数组,找到哪个值为null,然后添加一个'question'键,使其等于“Hi,请提供您的'key'。”最后,我想返回带有question键的对象数组 请参阅下面的代码: var list1 = [ { firstName: null, lastName: 'I.', country: 'Argentina', continent: 'Americas', age: 35, language: 'Java'

我的代码似乎返回一个未在对象中显式声明的空值

我试图编写的是一个代码,它将遍历一个对象数组,找到哪个值为null,然后添加一个'question'键,使其等于“Hi,请提供您的'key'。”最后,我想返回带有question键的对象数组

请参阅下面的代码:

var list1 = [
  { firstName: null, lastName: 'I.', country: 'Argentina', continent: 'Americas', age: 35, language: 'Java' },
  { firstName: 'Lukas', lastName: 'X.', country: 'Croatia', continent: 'Europe', age: 35, language: null },
  { firstName: 'Madison', lastName: 'U.', country: 'United States', continent: 'Americas', age: 32, language: 'Ruby' } 
];

function askForMissingDetails(list) {
    for (let i = 0; i < list.length; i++) {
      for (var prop in list[i]) {
        if ( list[i].prop == null) 
          list[i]['question'] = `Hi, could you please provide your ${prop}.`;
        else 
          list.splice(i,1);
      }
    }
  return list;
}

console.log(askForMissingDetails(list1))

看起来您正在混淆访问对象的方式。首先,您正在阅读
列表[i].prop
。这将查找一个按字面意思叫做
prop
的属性。要解决此问题,请将其更改为
list[i][prop]
。本例中的方括号表示动态查找。您不是在寻找
prop
键,而是在寻找
prop

的值,我相信您要的是map/reduce操作

您希望更改原始数组,以包括存在
null
值(“map”)的问题,并过滤掉完整的条目(“reduce”)

这一切都可以通过使用

const list=[{“firstName”:null,“lastName”:“I.”,“国家”:“阿根廷”,“大陆”:“美洲”,“年龄”:35,“语言”:“爪哇”},{“firtname”:“卢卡斯”,“lastName”:“X.”,“国家”:“克罗地亚”,“大陆”:“欧洲”,“年龄”:35,“语言”:null},{“firtname”:“麦迪逊”,“lastName”:“U.”,“国家”:“美国”,“大陆”:“美洲”,“年龄”:32,“语言”:“Ruby”}]
const missingDetail=列表。减少((arr,项目)=>{
//查找第一个空值条目
让[missing]=Object.entries(item).find([prop,val])=>val==null)| |[]
如果(缺失){
//missing包含第一个空值的属性名
//将带有问题对象的新项推送到最终数组
arr.push({
…项目,
问题:`嗨,你能提供你的${missing}吗}`
})
}
返回arr
}, [])

console.info(missingDetail)
I如果对象中有多个空值,则使用reduce创建一个新列表,其中包含要保留在数组中的属性问题:

var列表1=[
{
名字:空,
姓氏:“I.”,
国家:“阿根廷”,
大陆:“美洲”,
年龄:35岁,
语言:“Java”
},
{
名字:“卢卡斯”,
姓氏:“X.”,
国家:“克罗地亚”,
欧洲大陆:“欧洲”,
年龄:35岁,
语言:空
},
{
名字:“麦迪逊”,
姓氏:“U.”,
国家:“美国”,
大陆:“美洲”,
年龄:32岁,
语言:“Ruby”
},
{
名字:“基督徒”,
姓氏:空,
国家:“佩鲁”,
大陆:空,
年龄:32岁,
语言:空
}
];
//使用list1作为上下文应用要保存在myNewList上的reduce
const myNewList=list1.reduce((acc,item)=>{
//itering为当前对象的名称设置关键帧
Object.keys(项).forEach(项=>{
//如果当前键名为空,则其值为空
如果(!项[键]){
//如果没有名为question的键名,我将它创建为一个新的空数组
如果(!item.question)item.question=[];
//将具有当前密钥名的消息推入数组(因为为null)
item.question.push(`Hi,你能提供你的${key}.`);
}
});
//将当前对象推入累加器
如果(项目问题)根据推送(项目);
返回acc;
}, []);

console.log(myNewList)
您可能想要
list[i][prop]
而不是
list[i].prop
。您还可能在迭代时修改
列表
,这样会产生副作用如果有多个值为
null
,会发生什么情况?这是非常彻底的,但OP表示他们希望从最终结果中省略完整的项array@Phil哦,对不起。。。我没有完全阅读,嗯,如果在acc.push(项目)上,我应该添加一个。这不完全是我想要的,但这是一个我可以通过的reduce的好例子。谢谢:)
[
0:  {
firstName:  null
lastName:   "I."
country:    "Argentina"
continent:  "Americas"
age:    35
language:   "Java"
question:   "Hi, could you please provide your question."
}
1:  {
firstName:  "Lukas"
lastName:   "X."
country:    "Croatia"
continent:  "Europe"
age:    35
language:   null
question:   "Hi, could you please provide your question."
}
2:  {
firstName:  "Madison"
lastName:   "U."
country:    "United States"
continent:  "Americas"
age:    32
language:   "Ruby"
question:   "Hi, could you please provide your language."
}] 
let result = list1.reduce((acc, list) => {
    let missedKey = "";
    for(let key in list){
        if(!list[key]) missedKey = key
    }
    if(missedKey) { 
        list.question = `Hi, could you please provide your ${missedKey}.` 
        acc.push(list)
    };
    return acc;
}, []);