多维默认数组

时间:2019-04-25 13:42:35

标签: javascript lodash

我有两个多维数组:

using (Ionic.Zip.ZipFile zip = new Ionic.Zip.ZipFile()) 
{

    if (EncryptDoc.Checked)
    {
        if (masterPassword.Text == "")
        {
            MessageBox.Show("invalid Master password");

            goto SkipZip;
        }

        zip.Encryption = EncryptionAlgorithm.WinZipAes256;  // this is the problem line, will not compile**
         zip.Password = masterPassword.Text;
    }
    zip.AddSelectedFiles("*.RTF", "C:\\Charles GUI\\OpenFileDialogueSample\\Drug1\\Dev1\\Output");
  //

    // add the report into a different directory in the archive
    // zip.AddFile("c:\\Reports\\2008-Regional-Sales-Report.pdf", "files");
    //zip.AddFile("ReadMe.txt");
    zip.Save("c:\\temp\\MyZipFile.zip");
    _lblPagePrint.Text = "Zip RTFs Complete";
}

所需的结果是:

const defaultData = [
  ["ad", 0],
  ["ae", 0],
  ["af", 0]
]

const data = [
  ["az", 20],
  ["ad", 50]
]

此处az被忽略,因为它无效,因为它不在defaultData中。 广告有效,因此0会覆盖50。

我如何最好地产生这个结果。谢谢吗?

请假定两个数组均未排序。预期结果也不需要排序。

香草JS或Lodash都可以。

5 个答案:

答案 0 :(得分:2)

使用datadataByKey转换为对象(_.fromPairs())。映射defaultData,并检查dataByKey中是否存在“键”(索引0)。如果是,请使用dataByKey中的值创建一个新数组。如果没有返回原始数组。

const defaultData = [
  ["ad", 0],
  ["ae", 0],
  ["af", 0]
]

const data = [
  ["az", 20],
  ["ad", 50]
]

const dataByKey = _.fromPairs(data)

const result = defaultData.map(o => o[0] in dataByKey ? [o[0], dataByKey[o[0]]] : o)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

答案 1 :(得分:1)

尝试一下,我正在使用map()创建一个新数组,并使用find()从第二个数组中查找元素。

我比较默认数组中每个子数组的第一个索引项,如果第二个数组中的任何项在其第一个索引中具有相同的元素,那么我将其返回,如果没有匹配项,则不返回任何内容。

如果我有一个匹配的项目,那么我将使用其元素创建一个新数组。 如果没有匹配的商品,则使用默认商品的默认元素创建一个新商品。

iOS

答案 2 :(得分:1)

您可以首先从数据创建一个对象,然后对defaultData使用 Entity attachment = new Entity("activitymimeattachment"); FileStream stream = File.OpenRead(fileName); byte[] byteData = new byte[stream.Length]; stream.Read(byteData, 0, byteData.Length); stream.Close(); // Encode the data using base64. string encodedData = System.Convert.ToBase64String(byteData); attachment["subject"] = "Attachment"; attachment["filename"] = "emailstatement.pdf"; //byte[] fileStream = Encoding.ASCII.GetBytes(fileName); attachment["body"] = encodedData; attachment["mimetype"] = @"application\pdf"; attachment["attachmentnumber"] = 1; attachment["objectid"] = new EntityReference("email", emailguid); attachment["objecttypecode"] = "email"; service.Create(attachment); 方法来创建新数组并通过键从数据中获取值。

map

答案 3 :(得分:1)

使用map遍历defaultData,并使用find将每个迭代数组与data匹配:

const defaultData = [['ad', 0],['ae', 0],['af', 0]];
const data = [['az', 20],['ad', 50]];

const expected = defaultData.map(arr => {

  // Destructure the first element from `arr`
  // and assign it to `code`
  const [ code ] = arr;

  // `find` the array in `data` where the first element
  // matches `code`
  const found = data.find(el => el[0] === code);

  // If `found` is undefined return the whole array
  // otherwise return a new array with the code and the value
  // from the found array
  return found ? [code, found[1]] : arr;
});

console.log(expected);

答案 4 :(得分:1)

您可以像这样使用map / reduce:

const defaultData = [
  ["ad", 0],
  ["ae", 0],
  ["af", 0]
]

const data = [
  ["az", 20],
  ["ad", 50]
]

const result = defaultData.map(arr => data.reduce(([dKey, dVal], [key, val]) => [ dKey, dKey === key ? val : dVal ], arr));

console.log(result);