如何使用Ramda.js中的回调函数动态填充/扩展2d数组

问题描述 投票:0回答:1

我想创建一个动态函数,该函数可以简化数组转换回调以填充和扩展2d数组。

概述挑战

我想创建这样的函数

finalFunction({ array, header, ...args }, callbackFunctionToTransformArray)

限制

  • 给定的数组始终是二维数组
  • 标题作为字符串提供,将传递给callbackFunction
  • 回调函数总是必须返回一个包含标题作为Keys的“ changes”对象。每个键的值包含要插入的值的数组]

给定以下设置的输入参数(输入对象的一部分),它可以通过所有三种情况:

{
 array = [
  ["#","FirstName","LastName"]
  ["1","tim","foo"],
  ["2","kim","bar"]
],
header: "FirstName",
...args
}

重要

挑战不是创建回调函数,而是创建“ finalFunction”。

方案1:在不扩展的情况下转换现有阵列

// 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
}

方案2:通过水平扩展转换现有阵列

// 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
}

方案3:使用垂直和水平扩展转换现有阵列

// 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
    })

在我看来,新创建的逻辑必须。

  1. 调用回调函数以检索第一标题行可能缺少的条目
  2. 将缺少的“更改”对象的键添加到标题行
  3. 减少跳过第一行的数组
  4. 始终假定一个arrayblock(因为如果arrayblock仅具有长度1,可以覆盖场景#1和#2,那就很好了]
  5. 确保arrayblock的长度不需要回调提供“ length”参数,而是从为“ changes” obj中每个键提供的值的arraylength中捕获]
  6. 当前挑战

  1. 当前垂直扩展的解决方案要求回调在其结果中提供“长度”参数,以便为每个源行获取正确的重复次数。
  2. 如果在源数组的第一行中找不到新的Header,则将“更改”与sourceArray合并的当前函数不会自动创建新的Header。
  3. 我认为这是可行的,并且它将为我正在研究的当前项目带来巨大的好处,因为它为所有数组填充/扩展应用了标准化接口。

但是我感到很困惑,特别是在如何在一个函数中涵盖所有3种情况时。

任何想法或见解将不胜感激。

我想创建一个动态函数,该函数可以简化数组转换回调的工作,以填充和扩展2d数组。概述挑战我想创建一个像这样的函数...

javascript ramda.js
1个回答
0
投票

这里是一个尝试。我可能在这里仍然缺少一些东西,因为我完全忽略了您的header参数。是否以某种方式必要,或者该功能是否已由回调函数生成的change对象中的键捕获了?

© www.soinside.com 2019 - 2024. All rights reserved.