gpt4 book ai didi

javascript - 你有关于如何优化我的 javascript 数组遍历的建议吗?

转载 作者:行者123 更新时间:2023-12-03 00:21:03 24 4
gpt4 key购买 nike

我有一些巨大的数组结构,我必须遍历它们并读取一些分支,有时还必须修改一些叶子。

我想要使用的数组键本身作为数组传递,并在完全分离的其他地方生成。

这是我当前的解决方案:

var arraytraverse = function(array, keys, value = undefined) {
let pointer = array;
for (let i = 0; i < keys.length; i++) {
if (!keys.hasOwnProperty(i)) {
continue;
}
if (i === keys.length - 1 && value !== undefined) {
pointer[keys[i]] = value;
}
if (!pointer.hasOwnProperty(keys[i])) {
return null;
}
pointer = pointer[keys[i]];
}
return pointer;
}

这是我的 Jasmine 测试:

var data = {
a: {
b: {
c: {
foo: 'bar',
},
},
},
};

describe('arraytraverse', () => {

it('should be transparent', () => {
let res = arraytraverse(data, []);
expect(res).toEqual(data);
});

it('should be traversing', () => {
let res = arraytraverse(data, ['a', 'b']);
expect(res).toEqual(data.a.b);
});

it('should handle non existing', () => {
let res = arraytraverse(data, ['a', 'miss']);
expect(res).toBeNull();
});

it('should change by reference', () => {
arraytraverse(data, ['a', 'b', 'c', 'foo'], 'baz');
let res = arraytraverse(data, ['a', 'b', 'c', 'foo'], 'baz');
expect(res).toBe('baz');
expect(data.a.b.c.foo).toBe('baz');
});

});

一切都很好。

我只是想请教一些更有经验的人是否有办法改进我的代码。

或者还有我不知道的更好的方法吗?

不,我不想依赖任何 vendor 。我想学习。 ;)

TIA!

编辑:我对其添加了一些更改:pastebin.com/UkUUSAZX

最佳答案

命名

  • arraytraverse 可能应该是 objectTraverse
  • 数组应该是对象
  • 指针可能是当前? JavaScript 中没有指针!

keys 是一个数组

  • 如果要检查 keys 是否为数组,请在函数开头执行此操作,并处理 nullundefinedkeys.hasOwnProperty(i) 检查看起来很奇怪,因为您已经假设它是一个数组并获取它的长度。您不会在测试用例中对此进行测试;你会用 ["foo", null, "bar"] 这样的做什么?
  • 您可以将 keys.length 放入 const length = keys.length 中,然后在整个代码中使用它。
  • 您也可以执行++i(可能不再相关)。

最后一步

每次迭代时,您都会检查是否已到达数组末尾并需要设置一个值(i === keys.length - 1 && value !== undefined)。主循环最好少走一步,然后检查是否需要在循环后插入值,最后执行最后的取消引用 current = current[keys[length - 1]],最后检查是否存在,否则返回null

个人资料,个人资料,个人资料

JavaScript 在现代浏览器中得到了很多优化。一些旧技巧(例如++i)可能不再起作用,一些“性能改进”实际上可能会降低您现在的性能。要测试这一点,请使用大型数据集进行一些适当的分析以获得一些真实的指标。

关于javascript - 你有关于如何优化我的 javascript 数组遍历的建议吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54313314/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com