在 JavaScript 数组中测试对象

3

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

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

我需要测试键为slug的值:x,但我的对象数组有数百个对象。有没有一种方法可以在不手动遍历所有对象的情况下测试值?


6
没有。不过,如果你需要多次执行这个测试,可以建立一个“slug -> object”映射表,这样你就可以通过查找“slug”来简单地进行查找。 - Felix Kling
5
物品是否按照特定顺序到达,例如按照标识符?如果是的话,您可以执行二分查找。如果没有特定顺序,那么您只能手动循环遍历它们。 - La-comadreja
La-comadreja -- 它们按照ID顺序返回,而不是slug顺序。 - Peachey_A
3个回答

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
总体来说是个不错的答案。但我建议不要在数组上使用for-in - Scott Sauyet

0

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

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

0

问题:您需要过滤器或测试数组吗?如果是测试,则最好使用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'))


函数 .some() 仍将遍历数组。 - Spencer Wieczorek
根据 jsPerf 的测试结果(http://jsperf.com/json-stringify-vs-array-loop),some() 比 filter() 快800倍,比 JSON.stringify 快5000倍。 - agershun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接