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很抱歉,我的错误,缺少条件。更新后,现在它给出了正确的结果。感谢您指出空检查。