javascript - 遍历对象搜索属性并在成功时修改原始对象

标签 javascript arrays performance javascript-objects

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

的值

如果没有找到通知,则应返回nullfalse

我试过:

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>');

编辑:

尊重 datarelatedOrders 属性之间切换的解决方案。

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/

相关文章:

javascript - 从 iframe 到 ajax 的 session

javascript - AngularJS - ng-view 未加载

arrays - 如何在perl中合并两个数组,从每个数组交替值

javascript - Meteor:在 Controller 和助手之间共享/传递变量(差异文件)

ruby - 为什么 Ruby 的循环命令比 while true 慢?

javascript - 为什么内联脚本 > 外部样式表比外部样式表 > 脚本更快?

javascript - 告诉浏览器为同一域下的每个路径单独存储不同的密码

arrays - 如何计算两个数组之间相同数量的元素,不包括重复项

c++ - 无法在阵列添加和性能问题 CPU 与 GPU 中更改超过 10000 的阵列大小

c# - 如何加快此 LINQ 查询的速度?