在JS数组中测试对象

时间:2015-01-12 17:08:15

标签: javascript arrays json

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

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

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

3 个答案:

答案 0 :(得分:3)

好吧 - 不知怎的,你必须循环。但至少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']

答案 1 :(得分:0)

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

更新: 根据jsPerf http://jsperf.com/json-stringify-vs-array-loop一些()更快800次然后filter()和5000然后JSON.stringify。

    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'))

答案 2 :(得分:0)

另一个“非迭代”选项(这里可能是因为你的密钥非常具体),但这是最慢的,因为JSON.stringify操作缓慢:

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