var myObj =
data: {
{
chairId: "CHAIRCHROME009",
relatedOrders: [
{
someProp: 45423234,
data : {
firstOrder: {},
relatedOrders: [
{
someProp: 5757587,
data : {
firstOrder: {},
relatedOrders: [ ],
notifications: [
{
notificationId: "CHAIR-0909FF",
latestNotification: {
latestNotificationAction: "New",
priority: "High",
}
}
],
relations: [ ]
}
}
],
relations: [ ]
}
}
],
relations: [ ]
}
}
我如何无限循环遍历包含数组和对象的对象,本质上是搜索 notifications
属性。
在上面的示例中,通知在 myObj
中有 2 个级别,但它可以是 1 个级别或 100 个级别。 notifications
将始终在 relatedOrders
下找到,然后我需要确定 notifications.latestNotification.latestNotificationAction
如果没有找到通知,则应返回null
或false
。
我试过:
function isThereRelatedOrders(myObj) {
for(var k in myObj) {
var v = myObj[k];
if (k === "relatedOrders") {
isThereData(v[0]);
}
}
}
function isThereData(relatedOrder) {
for(var y in relatedOrder) {
var t = relatedOrder[y];
if (y === "data") {
isThereNotification(t);
}
}
}
function isThereNotification(t) {
for(var x in t) {
var j = t[x];
if (x === "notifications") {
console.lig('notifications found');
if(j[0].latestNotification.latestNotificationAction === "New") {
console.log('is new alert');
// Add a property to my original myObj root level of alert: new
}
else {
console.log('is old alert');
// Add a property to my original myObj root level of alert: old
}
}
else if(x === "relatedOrders") {
alert('SUB relatedOrders found');
isThereRelatedOrders(j[0]);
}
else {
alert('no notifications found');
}
}
}
isThereRelatedOrders(myObj);
有了上面的内容,一旦我的代码必须第二次调用 isThereRelatedOrders(),它永远不会遇到 if 语句。我猜它是因为现在需要查找 .data??
执行完上述操作后,我希望返回这样的内容:
var myObj = {
chairId: "CHAIRCHROME009",
alert: "New"
////////
最佳答案
此提案使用迭代和递归方法来获取所需的属性 notifications
及其内容。如果找到,则将内容插入 result
数组。如果什么都找不到,则数组保持为空。
function iter(o) {
if (Array.isArray(o)) {
o.forEach(iter);
return;
}
if (typeof o === 'object') {
Object.keys(o).forEach(function (k) {
if (k === 'chairId') {
chairId = o[k];
}
if (k === 'notifications') {
o[k].forEach(function (a) {
if ('latestNotificationAction' in a.latestNotification) {
result.push({
chairId: chairId,
alert: a.latestNotification.latestNotificationAction
});
}
});
}
iter(o[k]);
});
}
}
var myObj = { data: { chairId: "CHAIRCHROME009", relatedOrders: [{ someProp: 45423234, data: { firstOrder: {}, relatedOrders: [{ someProp: 5757587, data: { firstOrder: {}, relatedOrders: [], notifications: [{ notificationId: "CHAIR-0909FF", latestNotification: { latestNotificationAction: "New", priority: "High", } }], relations: [] } }], relations: [] } }], relations: [] } },
chairId,
result = [];
iter(myObj);
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
编辑:
尊重 data
和 relatedOrders
属性之间切换的解决方案。
function iter(o, flip) {
if (Array.isArray(o)) {
o.forEach(function (a) {
iter(a, flip);
});
return;
}
if (typeof o === 'object') {
if ('chairId' in o) {
chairId = o.chairId;
}
if (
flip === 'relatedOrders' &&
'notifications' in o &&
0 in o.notifications &&
'latestNotification' in o.notifications[0] &&
'latestNotificationAction' in o.notifications[0].latestNotification
) {
result.push({
chairId: chairId,
alert: o.notifications[0].latestNotification.latestNotificationAction
});
return;
}
flip in o && iter(o[flip], flipFlop[flip]);
}
}
var myObj = { data: { chairId: "CHAIRCHROME009", relatedOrders: [{ someProp: 45423234, data: { firstOrder: {}, relatedOrders: [{ someProp: 5757587, data: { firstOrder: {}, relatedOrders: [], notifications: [{ notificationId: "CHAIR-0909FF", latestNotification: { latestNotificationAction: "New", priority: "High", } }], relations: [] } }], relations: [] } }], relations: [] } },
chairId,
result = [],
flipFlop = { relatedOrders: 'data', data: 'relatedOrders' };
iter(myObj, 'data');
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
关于javascript - 遍历对象搜索属性并在成功时修改原始对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36087992/