JavaScript循环重新评估每次迭代导致问题

时间:2013-04-11 11:12:16

标签: javascript

我有这段代码:

var app = {
    items: [
        [{
            title: 'Overview',
            id: 'dashboard'
        }, {
            title: 'Reports',
            id: 'reports'
        }],
        [{
            title: 'Customers',
            id: 'customers'
        }, {
            title: 'Quotes',
            id: 'quotes'
        }, {
            title: 'Sales',
            id: 'sales'
        }],
        [{
            title: 'Suppliers',
            id: 'suppliers'
        }, {
            title: 'Purchases',
            id: 'purchases'
        }],
        [{
            title: 'Bank',
            id: 'bank'
        }, {
            title: 'Projects',
            id: 'projects',
            disabled: true
        }, {
            title: 'Journal',
            id: 'journal',
            disabled: true
        }]
    ]
}

var userDetails = {
    IsAdmin: true
};

for (var x = 0; x < app.items.length; x++) {
    app.items[x].filter(function (items) {
        if (items.disabled || (userDetails.IsAdmin && items.id !== 'quotes')) {
            var ind = app.items[x].indexOf(items);
            app.items[x].splice(ind, 1);
        }
    });
}

console.log(app.items);

输出结果是每个数组中有1个对象。这是不可取的,通过我的计算,应该只剩下一个对象(引号对象),

相关的jsFiddle:http://jsfiddle.net/UdzEW/

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

.filter的想法是你提供一个函数,它返回一个布尔值,用于确定值是保留还是继续;它不应该就地修改数组。

var filtered = app.items[x].filter(function (items) {
    if (items.disabled || (userDetails.IsAdmin && items.id !== 'quotes')) {
        return false;
    }
    return true;
});

filtered的内容现在应该包含一个新数组,其中只包含那些内部条件失败的项目。

答案 1 :(得分:0)

试试这个:

 for (var x = 0; x < app.items.length; x++) {
    app.items[x] = app.items[x].filter(function (items) {
       return !(items.disabled || (userDetails.IsAdmin && items.id !== 'quotes'));
   });
   !app.items[x].length && app.items.splice(x--, 1);
 }

它返回带有“Quotes”对象的[[Array(1)]]