Javascript 展平对象属性列表
我发现,在多年来以命令式思维工作之后,很难以函数式风格编写此代码 给定如下输入:Javascript 展平对象属性列表,javascript,dictionary,functional-programming,reduce,Javascript,Dictionary,Functional Programming,Reduce,我发现,在多年来以命令式思维工作之后,很难以函数式风格编写此代码 给定如下输入: [{'id': 'foo', frames: ['bar', 'baz']}, {'id': 'two', frames: ['three', 'four']}] 输出应为: [ { foo: 'bar' }, { foo: 'baz' }, { two: 'three' }, { two: 'four' } ] 如何用javascript以函数式风格编写此代码?假设输入是arr,您可以这样做 result =
[{'id': 'foo', frames: ['bar', 'baz']}, {'id': 'two', frames: ['three', 'four']}]
输出应为:
[ { foo: 'bar' }, { foo: 'baz' }, { two: 'three' }, { two: 'four' } ]
如何用javascript以函数式风格编写此代码?假设输入是
arr
,您可以这样做
result = []; // array
arr.forEach(function(o) { // go through elements
for (var i = 0; i < o.frames.length; i++) { // make a since we need to get two objs per element
var obj = {}; // an object which will be over written for every iteration
obj[o.id] = o.frames[i]; // set property name and value
result.push(obj); // finally push it in the array
}
});
result=[];//排列
arr.forEach(函数(o){//遍历元素
对于(var i=0;i
首先,让我们创建一个函数,给定一个对象,该函数将返回一个帧数组:
function toFrames(obj) {
var id = obj.id;
return obj.frames.map(function (frame) {
var obj = {};
obj[id] = frame;
return obj;
});
}
接下来,我们创建一个concat
函数:
function concat(a, b) {
return a.concat(b);
}
最后,我们进行转换:
var input = [{
id: "foo",
frames: ["bar", "baz"]
}, {
id: "two",
frames: ["three", "four"]
}];
var output = input.map(toFrames).reduce(concat);
请亲自观看演示:
var输入=[{
id:“foo”,
框架:[“酒吧”、“酒吧”]
}, {
id:“两个”,
框架:[“三”、“四”]
}];
var输出=输入.map(toFrames).reduce(concat);
警报(JSON.stringify(输出,null,4));
函数到帧(obj){
变量id=对象id;
返回对象帧映射(函数(帧){
var obj={};
obj[id]=帧;
返回obj;
});
}
函数concat(a,b){
返回a.concat(b);
}
for each我不太喜欢,但这是一个非常简单的解决方案!这是不正确的,这将只输出每个帧列表中的第一个值。您的编程风格不是很实用。您所做的只是将for
循环替换为forEach
。在我看来,它仍然是非常程序化的。@AaditMShah它用更少的代码完成它的工作,什么是程序化的和功能性的??这是一种更简洁的方式,而不是大块的代码。它可以很容易地转换成函数函数式编程不仅意味着用第一类函数编程,而且编程没有副作用。虽然您在程序中使用了高阶函数,但仍然存在副作用。将元素推送到数组是一个副作用。我不能用一句话来解释函数式编程。最好是你自己学习一门像Haskell这样的纯函数式编程语言。这样,您将更好地理解什么是函数式编程:现在我看它很简单,我必须更多地实践这一点。谢谢这对我帮助很大!谢谢。我有这个[{foo:'bar'},{foo:'baz'}{two:'three'},{two:'three'}]想要转换成这个[{foo:'bar',foo:'baz',two:'three',two:'three'}]。有什么指针吗