Javascript 从JSON对象中的数组获取数据

Javascript 从JSON对象中的数组获取数据,javascript,arrays,json,Javascript,Arrays,Json,我需要获取对象的时间戳,其中状态更改中的新名称已解决 我试过这个 console.log( ticket.updates ? ( (ticket.updates.find(x => x.status_change !== null) && ticket.updates.find(x => x.status_change !== null).status_change.new_name === 'Solved') ? ticket.updates.

我需要获取对象的
时间戳
,其中
状态更改中的
新名称
解决

我试过这个

console.log(
 ticket.updates ? 
 (
  (ticket.updates.find(x => x.status_change !== null) && 
   ticket.updates.find(x => x.status_change !== null).status_change.new_name === 'Solved') ?
  ticket.updates.find(x => x.status_change !== null).timestamp : 
   'new_name is ' + ticket.updates.find(x => x.status_change !== null).status_change.new_name
 ) 
 : 'No updates');
但是上面的代码没有给出预期的结果

这是我的数据集

{
    "updates": [{
            "timestamp": "2018-04-26 06:39:12",
            "by": {
                "name": "A1"
            },
            "status_change": {
                "new_name": "Open",
                "old_name": null
            }
        }, {
            "timestamp": "2018-04-27 00:09:44",
            "by": {
                "name": "B1"
            },
            "status_change": null
        }, {
            "timestamp": "2018-04-27 00:10:09",
            "by": {
                "name": "B1"
            },
            "status_change": {
                "new_name": "Solved",
                "old_name": "Open"
            }
        }
    ]
}

可能是什么问题

您可以在
find()
中使用多个布尔值将其短路,这样就不需要重复调用
find()

let obj={“updates”:[{“timestamp”:“2018-04-26 06:39:12”,“by”:{“name”:“A1”},“status_change”:{“new_name”:“Open”,“old_name”:null},{“timestamp”:“2018-04-27 00:09:44”,“by”:{“name”:“B1},“status_change”:null},{“timestamp”:“2018-04-27 00:10:09”,“by”:{“name”:“B1
让item=obj.updates.find(item=>
项目状态变更
&&item.status\u change.new\u name==“已解决”)
如果(项){//找到一个
console.log(item.timestamp)
}否则{//找不到
console.log(“无新项”)
}
您可以首先使用过滤掉不需要的对象。然后使用获取必要的字段

以下是如何:

const数据={
“更新”:[{
“时间戳”:“2018-04-26 06:39:12”,
“作者”:{
“名称”:“A1”
},
“状态变化”:{
“新名称”:“打开”,
“旧名称”:空
}
}, {
“时间戳”:“2018-04-27 00:09:44”,
“作者”:{
“名称”:“B1”
},
“状态更改”:空
}, {
“时间戳”:“2018-04-27 00:10:09”,
“作者”:{
“名称”:“B1”
},
“状态变化”:{
“新名称”:“已解决”,
“旧名称”:“打开”
}
}
]
}
常量时间戳=data.updates
.filter(x=>x.status\u change&&x.status\u change.new\u name===“已解决”)
.map(x=>x.timestamp);
如果(timestamps.length>=1){
log('updates:',时间戳);
}否则{
console.log(“无更新”);

}
下面的代码将按照您的要求执行
solvedData
将包含对象的时间戳,其中
status\u change
已解决的。请参阅下面的代码。任何问题都可以

var myData={
“更新”:[{
“时间戳”:“2018-04-26 06:39:12”,
“作者”:{
“名称”:“A1”
},
“状态变化”:{
“新名称”:“打开”,
“旧名称”:空
}
}, {
“时间戳”:“2018-04-27 00:09:44”,
“作者”:{
“名称”:“B1”
},
“状态更改”:空
}, {
“时间戳”:“2018-04-27 00:10:09”,
“作者”:{
“名称”:“B1”
},
“状态变化”:{
“新名称”:“已解决”,
“旧名称”:“打开”
}
}
]
};
var solvedData=[];
var i=0;
if(myData.updates){
对于(i=0;i这应该有效

  • 筛选现有状态更改
  • 筛选新的\u名称==“已解决”
  • 映射时间戳
const票证={
“更新”:[{
“时间戳”:“2018-04-26 06:39:12”,
“作者”:{
“名称”:“A1”
},
“状态变化”:{
“新名称”:“打开”,
“旧名称”:空
}
}, {
“时间戳”:“2018-04-27 00:09:44”,
“作者”:{
“名称”:“B1”
},
“状态更改”:空
}, {
“时间戳”:“2018-04-27 00:10:09”,
“作者”:{
“名称”:“B1”
},
“状态变化”:{
“新名称”:“已解决”,
“旧名称”:“打开”
}
}]
};
console.log(tickets.updates
.filter(x=>x.status\u change&&x.status\u change.new\u name==“已解决”)
.map(x=>x.timestamp));
好吧,不要在您的条件中使用,您最好使用为此而创建的,而且您只能使用一个
.some()
调用来对所有这些条件进行分组

而不是编写
x.status\u change!=null
,您只需编写
x.status\u change
,即可得到相同的结果

console.log(
    ticket.updates ?
      ticket.updates.some(x => x.status_change && x.status_change.new_name === 'Solved') ?
        ticket.updates.find(x => x.status_change && x.status_change.new_name === 'Solved').timestamp :
        'new_name is ' + ticket.updates.find(x => x.status_change).status_change.new_name
      : 'No updates');
演示:

let ticket={
“更新”:[{
“时间戳”:“2018-04-26 06:39:12”,
“作者”:{
“名称”:“A1”
},
“状态变化”:{
“新名称”:“打开”,
“旧名称”:空
}
}, {
“时间戳”:“2018-04-27 00:09:44”,
“作者”:{
“名称”:“B1”
},
“状态更改”:空
}, {
“时间戳”:“2018-04-27 00:10:09”,
“作者”:{
“名称”:“B1”
},
“状态变化”:{
“新名称”:“已解决”,
“旧名称”:“打开”
}
}]
};
console.log(
票务更新?
ticket.updates.some(x=>x.status\u change&&x.status\u change.new\u name=='Solved')?
ticket.updates.find(x=>x.status\u change&&x.status\u change.new\u name==='Solved')。时间戳:
'new\u name是'+ticket.updates.find(x=>x.status\u change).status\u change.new\u name

:“无更新”);
也许是最愚蠢的,但我认为最简单的解决方案是:

var ticket = {"updates":[{"timestamp":"2018-04-26 06:39:12","by":{"name":"A1"},"status_change":{"new_name":"Open","old_name":null}},{"timestamp":"2018-04-27 00:09:44","by":{"name":"B1"},"status_change":null},{"timestamp":"2018-04-27 00:10:09","by":{"name":"B1"},"status_change":{"new_name":"Solved","old_name":"Open"}}]};

for (var i in ticket.updates ) {
    var item=ticket.updates[i];
    if (typeof item.status_change === 'object' && item.status_change !== null) {
             if (item.status_change.new_name === 'Solved') {
                    alert('Found timestamp value: ' + item.timestamp);
             }
    }
}

感谢您的快速响应,并帮助我减少重复的
find()
呼叫感谢您的回答。顺便说一句,这会给出错误的结果。预期结果为2018-04-27 00:10:09@Bishan很抱歉,我的错误,缺少条件。更新后,现在它给出了正确的结果。感谢您指出空检查。