【问题标题】:Performant way to filtering an array of objects过滤对象数组的高效方法
【发布时间】:2015-03-29 07:23:40
【问题描述】:

这是过滤掉数组中所有现有对象的好方法吗?

var arrayOfObjects = [
        { id: 1, text: 'obj1'}, 
        { id: 2, text: 'obj2'}, 
        { id: 3, text: 'obj3'}
    ], 
    ids = [ 1, 3 ],
    filteredArray = [];

for (var x = 0, len = arrayOfObjects.length; x < len; x++) {
    for (var i = 0, ilen = ids.length; i < len; i++) {
        if (arrayOfObjects[x].id === ids[i]) {
            arrayOfObjects[x] = null;
            break;
        }
    }
}

filteredArray = _.filter(obj, function(o) { return !!(o); });

更新:这样做的目的是从 arrayOfObjects 中过滤出与 ids 数组中的 id 匹配的对象。所以上面的代码有效(filteredArray is [{ id: 2, text: 'obj2'}],但是有没有更好的方法来完成这个?

【问题讨论】:

  • 你想做什么?从数组中删除所有对象?
  • 你可以通过设置obj.length = 0来清空一个数组。如果您尝试做除此之外的其他事情,请用文字描述您想要完成的具体内容并显示所需的输入和输出。
  • @AmitJoki,谢谢,我添加了更多信息。

标签: javascript performance underscore.js


【解决方案1】:

是的,有更好的方法:

var array = [
    { id: 1, text: "obj1" }, 
    { id: 2, text: "obj2" }, 
    { id: 3, text: "obj3" }
];

var ids = [1, 3];

var idsIndex = toIndex(ids);

var result = array.filter(function (obj) {
    return !idsIndex.hasOwnProperty(obj.id);
});

alert(JSON.stringify(result, null, 4));

function toIndex(array) {
    var length = array.length;
    var result = {};
    var index  = 0;

    while (index < length)
        result[array[index++]] = true;
    return result;
}

toIndex 函数的文档在以下答案中(注意它被称为 index_of_array):https://stackoverflow.com/a/28358301/783743

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 2022-11-26
    相关资源
    最近更新 更多