你认为for in和for循环有很大的不同吗?您更喜欢使用什么样的"for"?为什么?
假设我们有一组关联数组:
var myArray = [{'key': 'value'}, {'key': 'value1'}];
Run Code Online (Sandbox Code Playgroud)
所以我们可以迭代:
for (var i = 0; i < myArray.length; i++)
Run Code Online (Sandbox Code Playgroud)
和:
for (var i in myArray)
Run Code Online (Sandbox Code Playgroud)
我没有看到很大的不同.有任何性能问题吗?
我试图找到运行具有自己范围的for循环的最快方法.我比较的三种方法是:
var a = "t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t".split();
// lodash .each -> 1,294,971 ops/sec
lodash.each(a, function(item) { cb(item); });
// native .forEach -> 398,167 ops/sec
a.forEach(function(item) { cb(item); });
// native for -> 1,140,382 ops/sec
var lambda = function(item) { cb(item); };
for (var ix = 0, len = a.length; ix < len; ix++) {
lambda(a[ix]);
}
Run Code Online (Sandbox Code Playgroud)
这是在OS X上的Chrome 29上.您可以在此处自行运行测试:
Lodash的.each速度几乎是原生的两倍.forEach?而且,它比平原更快for?巫术?黑魔法?
假设我有一个数组var arr = [1, 2, 3],我想用元素分隔每个元素,例如.var sep = "&",所以输出是[1, "&", 2, "&", 3].
考虑它的另一种方法是我想做Array.prototype.join(arr.join(sep))而不是结果是一个字符串(因为我试图使用的元素和分隔符是对象,而不是字符串).
有没有一种功能性/漂亮/优雅的方式来做es6/7或lodash没有像笨重的东西:
_.flatten(arr.map((el, i) => [el, i < arr.length-1 ? sep : null])) // too complex
Run Code Online (Sandbox Code Playgroud)
要么
_.flatten(arr.map(el => [el, sep]).slice(0,-1) // extra sep added, memory wasted
Run Code Online (Sandbox Code Playgroud)
甚至
arr.reduce((prev,curr) => { prev.push(curr, sep); return prev; }, []).slice(0,-1)
// probably the best out of the three, but I have to do a map already
// and I still have the …Run Code Online (Sandbox Code Playgroud) 在以下代码中,user.roles的实际长度为1.但是,循环运行两次.
当我输出i的值时,它会在第二次迭代时显示为"diff".切换到普通for循环解决了这种情况.但是,我想知道for..in循环的问题是什么.
for (var i in user.roles) {
if (user.roles[i].school.equals(schoolId)) {
for (var j in user.roles[i].permissions) {
for (var k in accessType) {
if (user.roles[i].permissions[j].feature == featureKey) {
if (user.roles[i].permissions[j][accessType[k]]) {
return true;
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新:user是一个对象,而角色是一个对象数组.导致该问题的角色实例如下所示:
{
"_id": "582d3390d572d05c1f028f53",
"displayName": "Test Teacher Attendance",
"gender": "Male",
"roles": [
{
"_id": "57a1b3ccc71009c62a48a684",
"school": "57a1b3ccc71009c62a48a682",
"role": "Teacher",
"__v": 0,
"designation": true,
"permissions": [
{
"feature": "User",
"_id": "57ac0b9171b8f0b82befdb7d",
"review": false,
"view": true,
"delete": false,
"edit": false,
"create": …Run Code Online (Sandbox Code Playgroud) 如果three找到,那么它应该返回true并停止迭代.否则返回false如果找不到则返回false.
我正在使用filter()- 这是错误的使用方法吗?
var data = [
'one',
'two',
'three',
'four',
'three',
'five',
];
found = data.filter(function(x) {
console.log(x);
return x == "three";
});
console.log(found);
Run Code Online (Sandbox Code Playgroud)