我有一个数组(下面的例子数组) –
a = [{"name":"age","value":31},{"name":"height (inches)","value":62},{"name":"location","value":"Boston,MA"},{"name":"gender","value":"male"}];
我想迭代这个数组的对象并产生一个新的Object(不是特别的减少).
我有这两种方法 –
a = [{"name":"age","value":"male"}]; // using Array.prototype.map() b = a.map(function(item){ var res = {}; res[item.name] = item.value; return res; }); console.log(JSON.stringify(b)); var newObj = []; // using Array.prototype.forEach() a.forEach(function(d){ var obj = {}; obj[d.name] = d.value; newObj.push(obj) }); console.log(JSON.stringify(newObj))
在这种操作中使用任何一种操作是不对的?
另外,我想了解一个用户比较好的用例情况?还是应该坚持for循环?
解决方法
正如您在评论中已经讨论过的,这里没有完全错误的答案.除了一些相当精细的表现之外,这是一个风格问题.您正在解决的问题可以通过for循环,.forEach(),.reduce()或.map()来解决.
我按照这个顺序故意地列出它们,因为它们中的每一个都可以使用列表中的任何东西重新实现.例如,您可以使用.reduce()来重复.map(),但不是相反的.
在您的具体情况下,除非微型优化对您的域至关重要,否则我将在可读性和代码维护的基础上作出决定.在这个基础上,.map()具体而准确地说出你所追求的内容;阅读代码的人会看到它,并且知道你正在使用一个数组来生成另一个数组.你可以用.forEach()或.reduce()完成这个任务,但是因为这些能够被用于更多的东西,所以有人必须花费额外的时间来理解你使用它们. .map()是最有意义的调用.
(是的,这意味着在本质上优先考虑执行效率的效率,如果代码不是高需求应用程序中性能瓶颈的一部分,我认为这是适当的.
您询问了另一个可能是首选的场景.在这种情况下,.map()的工作原理是输出数组,输出数组的长度与输入数组的长度相同. (再次,这就是.map()).如果要输出数组,但是您可能需要为输入的单个元素生成两个(或零个)输出元素,那么.map()将会出来,我可能会使用.reduce(). (链接.filter().map()也将是“跳过一些输入元素”的可能性,并且将是相当清晰的)
如果要将输入数组的内容分割成多个输出数组,可以使用.reduce()(通过将所有内容封装为单个对象的属性)来实现,但是.forEach()或for循环将会看起来对我来说更自然