【问题标题】:Do any prevalent Javascript frameworks provide a utility for pruning objects?是否有任何流行的 Javascript 框架提供用于修剪对象的实用程序?
【发布时间】:2009-08-13 16:59:31
【问题描述】:

我们在一个 UI 密集度较低的项目中使用 jQuery,而我们一直在其他项目中使用 ExtJS。无论如何,我很好奇是否有任何流行的库,如 ExtJS、jQuery 或其他库,提供用于“修剪”对象的实用程序?我的意思是,如果键不包含值,则删除它们。

我已经设计了我自己的(天真的)实现如下,所以它没什么大不了的。虽然只是好奇,因为我相信这通常是有用的。我用谷歌搜索了“jquery prune object”,但似乎没有结果值得调查,当然我可能是错的;)

function pruneObj(obj) {
    var empty = [];
    for (var attr in obj) {
        if (!obj[attr]) {
            empty.push(attr); //rather than trying to delete the element in place
        }
    }
    for (var i=0, n=empty.length; i<n; i++) {
        delete(obj[empty[i]]);
    }
    return obj;
}

【问题讨论】:

    标签: javascript object


    【解决方案1】:

    所以:

    var obj = { hasFoo: false, count: 0 }
    

    会(在致电prunObj(obj) 之后)只是{}

    我认为没有任何图书馆会假设哪些值被认为是“空的”。这是一个破坏性/突变性太大的函数,不能作为一组标准实用函数的一部分。

    许多库或浏览器都包含一个工具,可以从不满足特定条件的数组中过滤掉项目。比如filter:

    list.filter(function(item){
        return !item.foo
    })
    

    将过滤掉listfoo 属性中具有"falsey" value 的项目。

    编辑

    进一步考虑,undefined 似乎被 jQuery 和 Prototype 认为是“空的”。 jQuery 的 extend 函数可以用 undefined 完成我认为您的目标,尽管语法略有不同并且 不会改变传递的参数:

    A = { hasFoo: false, count: 0, foo: null, bar: undefined };
    B = jQuery.extend({}, A); // B = { hasFoo: false, count: 0, foo: null }
    

    "jQuery""Object" 交换为原型等效项。

    【讨论】:

    • 你是对的,使用我的 pruneObj 函数后,上面的 obj 将只是 {}。这正是我说我的实现很幼稚的原因;)感谢您提醒我有关各种库的过滤功能。但是,它们是否过滤对象而不是您指出的列表?无论如何,它为我提供了一个更好的研究起点,所以谢谢!
    猜你喜欢
    • 2010-10-09
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 2013-09-21
    • 1970-01-01
    相关资源
    最近更新 更多