JavaScript 通过来自另一个的数据过滤数组

IT技术 javascript arrays filter
2021-02-06 03:38:00

我有一个数组对象:

[
    { id:1, name: 'Pedro'},
    { id:2, name: 'Miko'},
    { id:3, name: 'Bear'},
    { id:4, name: 'Teddy'},
    { id:5, name: 'Mouse'}
]

我有一个 ID 为 [1, 3, 5] 的数组,

如何过滤数组对象以仅保留第二个 id 的记录?

6个回答

如果Array.includes()支持,您可以使用它Array.filter()来获取项目:

const array = [
  { id: 1, name: 'Pedro'},
  { id: 2, name: 'Miko'},
  { id: 3, name: 'Bear'},
  { id: 4, name: 'Teddy'},
  { id: 5, name: 'Mouse'}
];

const filterArray = [1,3,5];

const result = array.filter(({ id }) => filterArray.includes(id));

console.log(result);

如果不支持包含,您可以使用Array.indexOf()

var array = [
  { id: 1, name: 'Pedro'},
  { id: 2, name: 'Miko'},
  { id: 3, name: 'Bear'},
  { id: 4, name: 'Teddy'},
  { id: 5, name: 'Mouse'}
];

var filterArray = [1,3,5];

var result = array.filter(function(item) {
    return filterArray.indexOf(item.id) !== -1;
});

console.log(result);

也许将 aArray.prototype.reduceArray.prototype.some. 这会保持给定数组的顺序need

var data = [
        { id: 3, name: 'Bear' },
        { id: 4, name: 'Teddy' },
        { id: 5, name: 'Mouse' },
        { id: 1, name: 'Pedro' },
        { id: 2, name: 'Miko' },
    ],
    need = [1, 3, 5],
    filtered = need.reduce(function (r, a) {
        data.some(function (el) {
            return a === el.id && r.push(el);
        });
        return r;
    }, []);

document.write('<pre>' + JSON.stringify(filtered, 0, 4) + '</pre>');

为了保持data您可以使用的顺序Array.prototype.filter

var data = [
        { id: 3, name: 'Bear' },
        { id: 4, name: 'Teddy' },
        { id: 5, name: 'Mouse' },
        { id: 1, name: 'Pedro' },
        { id: 2, name: 'Miko' },
    ],
    need = [1, 3, 5],
    filtered = data.filter(function (a) {
        return ~need.indexOf(a.id);
    });

document.write('<pre>' + JSON.stringify(filtered, 0, 4) + '</pre>');

如果数据集很小,您可以使用任何提供的解决方案(使用 indexOf 的解决方案)。

然而,这些解决方案是 O(n^2) 的,因此,如果数据集足够大,滞后会变得很明显。在这种情况下,您应该在选择元素之前构建索引。

例子:

function filterFast(data, ids) {
    var index = ids.reduce(function(a,b) {a[b] = 1; return a;}, {});
    return data.filter(function(item) {
        return index[item.id] === 1;
    });
}

一些基准测试可以在这里进行测试

您可以在 Array 上使用filter 方法

var data = [
    { id:1, name: 'Pedro'},
    { id:2, name: 'Miko'},
    { id:3, name: 'Bear'},
    { id:4, name: 'Teddy'},
    { id:5, name: 'Mouse'}
];

var ids = [1, 3, 5];

var filteredData = filterData(data, 'id', ids[1]);

function filterData(data, prop, values) {
    return data.filter(function(item) {
        return ~values.indexOf(item[prop]); // ~ returns 0 if indexOf returns -1
    });
}

在这个 JSFiddle 中查看它的实际效果

或者,如果您使用的是 jQuery,另一种选择可能是:

var arr1 = [1, 3, 5],
    arr2 = [{ id: 1, name: 'Pedro' },
    { id: 2, name: 'Miko' },
    { id: 3, name: 'Bear' },
    { id: 4, name: 'Teddy' },
    { id: 5, name: 'Mouse' }],
    filtered = $.grep(arr2, function (item) {
    if (arr1.indexOf(item.id) > -1) {
        return true;
    }
});