我想创建一个动态函数,该函数可以简化数组转换回调以填充和扩展2d数组。
我想创建这样的函数
finalFunction({ array, header, ...args }, callbackFunctionToTransformArray)
限制
- 给定的数组始终是二维数组
- 标题作为字符串提供,将传递给callbackFunction
- 回调函数总是必须返回一个包含标题作为Keys的“ changes”对象。每个键的值包含要插入的值的数组]
给定以下设置的输入参数(输入对象的一部分),它可以通过所有三种情况:
{
array = [
["#","FirstName","LastName"]
["1","tim","foo"],
["2","kim","bar"]
],
header: "FirstName",
...args
}
重要
挑战不是创建回调函数,而是创建“ finalFunction”。
// return for the second row of the array
callback1 => {
changes: {
FirstName: ["Tim"]
}
};
// return for the third row of the array
callback1 => {
changes: {
FirstName: ["Kim"]
}
};
finalFunction({ array, header, ...args }, callback1)
应该返回
{
array: [
["#","FirstName","LastName"]
["1","Tim","foo"],
["2","Kim","bar"]
],
header: "FirstName",
...args
}
// return given for the second row
callback2 => {
changes: {
FullName: ["Tim Foo"]
}
};
// return given for the third row
callback2 => {
changes: {
FullName: ["Kim Bar"]
}
};
finalFunction({ array, header, ...args }, callback2)
应该返回
{
array: [
["#","FirstName","LastName","FullName"]
["1","Tim","foo","Tim Foo"],
["2","Kim","bar","Kim Bar"]
],
header: "FirstName",
...args
}
// return given for the second row
callback3 => {
changes: {
"Email": ["[email protected]","[email protected]"],
"MailType": ["Work","Personal"]
}
};
// return given for the third row
callback3 => {
changes: {
"Email": ["[email protected]","[email protected]"],
"MailType": ["Work","Personal"]
}
};
finalFunction({ array, header, ...args }, callback3)
应该返回
{
array: [
["#","FirstName","LastName","Email","MailType"]
["1","Tim","foo","[email protected]","Work"],
["1","Tim","foo","[email protected]","Personal"],
["2","Kim","bar","[email protected]","Work"],
["2","Kim","bar","[email protected]","Personal"]
],
header: "FirstName",
...args
}
美妙的@Scott Sauyet帮助我在二维数组和changes对象之间创建了合并功能:
const addInputToArray = ({ array, changes, ...rest}) => ({
array: Object .entries (changes) .reduce ((a, [k, vs], _, __, index = array [0] .indexOf (k)) =>
vs.reduce(
(a, v, i) =>
(i + 1) in a
? update ((i + 1), update (index, v, a [i + 1] ), a)
: concat (a, [update (index, v, map (always (''), array [0]) )] ),
a),
array
),
...rest
})
这对于方案#1很有用。但是,如果它们不是原始数组的一部分,我似乎无法获得自动创建标头的解决方案。
但是,我在方案3中所述的垂直扩展方面取得了进展。
const expandVertically = ({ array, header, index = array[0].indexOf(header), ...args }, callback) => ({
array: array.reduce((a, v, i) => {
if (i === 0) {
a.push(v);
} else {
const arrayBlock = R.repeat(v, callback(v[index]).length);
arrayBlock.unshift(array[0]);
const result = addInputToArray({
changes: callback(v[index]).changes,
array: arrayBlock
}).array;
result.shift();
result.map(x => a.push(x));
}
return a;
}, []),
header,
...args
})
在我看来,新创建的逻辑必须。
我认为这是可行的,并且它将为我正在研究的当前项目带来巨大的好处,因为它为所有数组填充/扩展应用了标准化接口。
但是我感到很困惑,特别是在如何在一个函数中涵盖所有3种情况时。
任何想法或见解将不胜感激。
我想创建一个动态函数,该函数可以简化数组转换回调的工作,以填充和扩展2d数组。概述挑战我想创建一个像这样的函数...
这里是一个尝试。我可能在这里仍然缺少一些东西,因为我完全忽略了您的header
参数。是否以某种方式必要,或者该功能是否已由回调函数生成的change
对象中的键捕获了?