在 JS 数组中的对象上进行测试
Testing on Objects in JS Arrays
我有一个在 API 请求后返回的对象数组。它采用以下形式:
[{
id: 12,
slug: '050e8e8db93ae08ed46cd57017ef9617',
name: 'Test Badge'
}, {
id: 13,
slug: '78ed09b1f2aae29ab30915ac9f167bfa',
name: 'Test Badge'
}]
我需要测试一个值:键上的x
:slug
,但我的对象数组有数百个对象长。有没有办法在不手动遍历所有对象的情况下测试值?
好吧 - 不知何故你必须循环。但至少 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;
}
相关文章:
- 测试对象是否相等和/或对象是否有更多的关键点,但仍然与共同的关键点相等
- 使用 Jasmine 测试对象中的事件处理程序
- 如何使用Ramda通过“where”比较测试对象中的属性值
- 测试对象数组中是否存在值
- 测试对象是否是 Google 闭包类框架中接口的实现
- 是否有函数可以测试对象是否与其他对象匹配
- 为网站自动化生成 JavaScript 测试对象的最佳方法是什么?
- 使用 Lodash 或 AngularJS 测试对象中是否存在值的最简单方法是什么?
- 如何在 JSON 字符串中选择两个测试对象并将它们映射到我的接口
- 柴断言测试对象结构是否至少包含其他对象结构
- Jasmine测试对象方法
- 测试对象数组中的值
- 测试对象上的属性是否是单个可观察的(而不是observableArray)
- 如何在IE8中测试对象文字
- 如何测试对象的可选成员
- 什么是深度测试对象的简明方法hasOwnProperty(或类似方法)
- 如何测试对象"isEmpty()"如果对象.原型被修改
- 在不同浏览器上测试对象delete值的问题
- 茉莉花测试:对象没有't支持属性或方法
- 在Ajax方法间谍调用上测试对象的茉莉花状态