在 JS 数组中的对象上进行测试

Testing on Objects in JS Arrays

本文关键字:测试 对象 JS 数组      更新时间:2023-09-26

我有一个在 API 请求后返回的对象数组。它采用以下形式:

[{
    id: 12,
    slug: '050e8e8db93ae08ed46cd57017ef9617',
    name: 'Test Badge'
}, {
    id: 13,
    slug: '78ed09b1f2aae29ab30915ac9f167bfa',
    name: 'Test Badge'
}]

我需要测试一个值:键上的xslug,但我的对象数组有数百个对象长。有没有办法在不手动遍历所有对象的情况下测试值?

好吧 - 不知何故你必须循环。但至少 JavaScript 适合你:

var arr = [
    {
        id: 12,
        slug: '050e8e8db93ae08ed46cd57017ef9617',
        name: 'Test Badge'
    },
    {
        id: 13,
        slug: '78ed09b1f2aae29ab30915ac9f167bfa',
        name: 'Test Badge'
    }
];
var arrWithValue = arr.filter(function(el){ return el.slug === value; });

arrWithValue仅包含具有正确值的数组元素。

当您必须经常访问这些数据时,最好循环一次并使用slug保存每个对象作为key

var sortedObj = {};
for(var i = 0, len = arr.length; i < len; ++i){
    sortedObj[arr[i].slug] = arr[i];
}
// access the object with sortedObj['someSlug']

问题:您需要过滤器或测试数组的值吗?如果测试,那么最好使用 some() 函数。

更新: 根据 jsPerf http://jsperf.com/json-stringify-vs-array-loop some() 的速度比 filter() 快 800 倍,然后是 JSON.stringify,5000 倍。

    var data = [{
        id: 12,
        slug: '050e8e8db93ae08ed46cd57017ef9617',
        name: 'Test Badge'
    }, {
        id: 13,
        slug: '78ed09b1f2aae29ab30915ac9f167bfa',
        name: 'Test Badge'
    }];
    function test(x) {
        return data.some(function(d){return x==d.slug});
    };
    console.log(test('78ed09b1f2aae29ab30915ac9f167bfa'))

另一个"非迭代"选项(在这里是可能的,因为你的键非常具体),但这是最慢的,因为JSON.stringify的操作很慢:

function test(x) {
    return JSON.stringify(data).indeхOf(x) > -1;
}