我有一个数组(下面的示例数组)-
a = [{"name":"age","value":31},
{"name":"height (inches)","value":62},
{"name":"location","value":"Boston, MA"},
{"name":"gender","value":"male"}];
我想遍历这个对象数组并生成一个新对象(不是特别减少)。
我有这两种方法 -
a = [{"name":"age","value":31},
{"name":"height (inches)","value":62},
{"name":"location","value":"Boston, MA"},
{"name":"gender","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 循环对我来说看起来更自然。
关于javascript - Array.prototype.map() 和 Array.prototype.forEach(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29927278/
我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)
通过rubykoans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John
这个问题在这里已经有了答案:Arraysmisbehaving(1个回答)关闭6年前。是否应该这样,即我误解了,还是错误?a=Array.new(3,Array.new(3))a[1].fill('g')=>[["g","g","g"],["g","g","g"],["g","g","g"]]它不应该导致:=>[[nil,nil,nil],["g","g","g"],[nil,nil,nil]]
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我正在使用Rails3.2.3和Ruby1.9.3p0。我发现我经常需要确定某个字符串是否出现在选项列表中。看来我可以使用Ruby数组.includemethod:或正则表达式equals-tildematchshorthand用竖线分隔选项:就性能而言,一个比另一个好吗?还有更好的方法吗? 最佳答案 总结:Array#include?包含String元素,在接受和拒绝输入时均胜出,对于您的示例只有三个可接受的值。对于要检查的更大的集合,看起来Set#include?和String元素可能会获胜。如何测试我们应该根据经验对此进行测试
我需要从json记录中获取一些值并像下面这样提取curr_json_doc['title']['genre'].map{|s|s['name']}.join(',')但对于某些记录,curr_json_doc['title']['genre']可以为空。所以我想对map和join()使用try函数。我试过如下curr_json_doc['title']['genre'].try(:map,{|s|s['name']}).try(:join,(','))但是没用。 最佳答案 你没有正确传递block。block被传递给参数括号外的方法
如thisanswer中所述,Array.new(size,object)创建一个数组,其中size引用相同的object。hash=Hash.newa=Array.new(2,hash)a[0]['cat']='feline'a#=>[{"cat"=>"feline"},{"cat"=>"feline"}]a[1]['cat']='Felix'a#=>[{"cat"=>"Felix"},{"cat"=>"Felix"}]为什么Ruby会这样做,而不是对object进行dup或clone? 最佳答案 因为那是thedocumenta
Enumerable#each和Enumerable#map的区别在于返回的是接收者还是映射后的结果。回到接收者是微不足道的,你通常不需要在each之后继续一个方法链,比如each{...}.another_method(我可能没见过这样的案例。即使你想回到接收者那里,你也可以通过tap来实现)。所以我认为所有或者大部分使用Enumerable#each的情况都可以用Enumerable#map代替。我错了吗?如果我是对的,each的目的是什么?map是否比each慢?编辑:我知道当您对返回值不感兴趣时使用each是一种常见的做法。我对这种做法是否存在不感兴趣,但感兴趣的是,除了从
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan
我认为按照惯例,只有带有感叹号的方法才能更改对象。>array=[1,2,3]=>[1,2,3]>array.pop=>3>array=>[1,2]为什么Array的pop方法不调用pop!? 最佳答案 这不太正确。来自TheRubyStyleGuide潜在“危险”方法的名称(即修改自身或参数的方法,exit!(不像exit那样运行终结器)等)如果存在则应以感叹号结尾该危险方法的安全版本。而且pop方法的名称准确地说明了它在做什么,因此无需使用感叹号对其进行签名。 关于ruby-为什么A