【问题标题】:Filter, join and modify two arrays过滤、连接和修改两个数组
【发布时间】:2021-10-14 03:31:48
【问题描述】:

我在Typescript中有一个项目,我想在其中考虑一个字段的信息来连接两个数组,即如果该字段的值匹配,则删除一个并合并该数组的数据。

这些是我的arrays

let sheet = [ { fecDate: date,
    codCountry: 'CO',
    fileName: 'CO_SER.txt',
    ftpExists: 0,
    sheetExists: 1 },
{ fecDate: date,
    codCountry: 'CO',
    fileName: 'CO_DAT.txt',
    ftpExists: 0,
    sheetExists: 1 } ]
    
let ftp = [ { fecDate: date,
    codCountry: 'CO',
    fileName: 'CO_SER.txt',
    ftpExists: 1,
    sheetExists: 0 },
{ fecDate: date,
    codCountry: 'CO',
    fileName: 'CO_PRU.txt',
    ftpExists: 1,
    sheetExists: 0 } ]

这就是我想要实现的目标:

let result = [ { fecDate: date,
    codCountry: 'CO',
    fileName: 'CO_SER.txt',
    ftpExists: 1,
    sheetExists: 1 },
{ fecDate: date,
    codCountry: 'CO',
    fileName: 'CO_DAT.txt',
    ftpExists: 0,
    sheetExists: 1 },
{ fecDate: date,
    codCountry: 'CO',
    fileName: 'CO_PRU.txt',
    ftpExists: 1,
    sheetExists: 0 } ]

这是我到目前为止的代码,目前我只设法过滤不在另一个数组中的数据:

let onlyFtp = ftp.filter(await this.objectComparer(sheet, ftp, 'fileName'));
let onlySheet = sheet.filter(await this.objectComparer(ftp, sheet, 'fileName'));

public async objectComparer(fstArr: any, secArr: any) {
    try {

        let only = fstArr.filter(
          (fstItem: any) => !secArr.some((secItem: any) => fstItem[key] === secItem[key])
        );
        
        return only;
      
    } catch (error) {
        return Promise.reject(error);
    }  
}

onlyFtp = [{ fecDate: date,
    codCountry: 'CO',
    fileName: 'CO_PRU.txt',
    ftpExists: 1,
    sheetExists: 0 } ]
    
onlySheet = [{ fecDate: date,
    codCountry: 'CO',
    fileName: 'CO_DAT.txt',
    ftpExists: 0,
    sheetExists: 1 } ]

这样我得到了不变的数组,所以我只需要更新文件名为“CO_SER.txt”的数组

我的问题:我需要把fileName字段重复的数组去掉,但是不知道如何合并两个数组并更改对应的属性

【问题讨论】:

  • 向我们展示您的编码尝试。
  • @RobertHarvey 我已经用我现在的代码更新了我的代码,我只设法过滤那些不匹配的代码以了解那些没有变化的代码

标签: javascript arrays typescript ecmascript-6


【解决方案1】:

使用 for 循环连接两个数组并合并 -

const date = '12/07/2021';
const sheet = [{
    fecDate: date,
    codCountry: 'CO',
    fileName: 'CO_SER.txt',
    ftpExists: 0,
    sheetExists: 1
  },
  {
    fecDate: date,
    codCountry: 'CO',
    fileName: 'CO_DAT.txt',
    ftpExists: 0,
    sheetExists: 1
  }
];

const ftp = [{
    fecDate: date,
    codCountry: 'CO',
    fileName: 'CO_SER.txt',
    ftpExists: 1,
    sheetExists: 0
  },
  {
    fecDate: date,
    codCountry: 'CO',
    fileName: 'CO_PRU.txt',
    ftpExists: 1,
    sheetExists: 0
  }
];

const merged = [...sheet, ...ftp];
const result = [];
for (const item of merged) {
  const existingItem = result.find(f => f.fileName == item.fileName);
  if (!existingItem) {
    result.push(item);
  } else {
    existingItem.ftpExists |= item.ftpExists;
    existingItem.sheetExists |= item.sheetExists;
  }
}
console.log(result);

【讨论】:

    【解决方案2】:

    使用地图(唯一键)
    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

    let sheet = [ { fecDate: '',
        codCountry: 'CO',
        fileName: 'CO_SER.txt',
        ftpExists: 0,
        sheetExists: 1 },
    { fecDate: '',
        codCountry: 'CO',
        fileName: 'CO_DAT.txt',
        ftpExists: 0,
        sheetExists: 1 } ]
        
    let ftp = [ { fecDate: '',
        codCountry: 'CO',
        fileName: 'CO_SER.txt',
        ftpExists: 1,
        sheetExists: 0 },
    { fecDate: '',
        codCountry: 'CO',
        fileName: 'CO_PRU.txt',
        ftpExists: 1,
        sheetExists: 0 } ]
        
    const map = new Map([...sheet, ...ftp].map(i => [i.fileName, i]))
    
    // assuming sheets array sets sheetExists property
    sheet.forEach(item => {
      // map.get(item.fileName).sheetExists = 1
      // edit:
      const mapItem = map.get(item.fileName)
      mapItem.ftpExists = mapItem.ftpExists || item.ftpExists
      mapItem.sheetExists = mapItem.sheetExists || item.sheetExists
    })
    
    const result = Array.from(map.values())
    console.log(result)

    【讨论】:

    • 这个只在这种情况下有效,但是如果要修改的字段是ftpExists那么你必须更改代码
    • forEach 上面的代码注释是这样说的
    • 代码已更新,我假设一个数组定义工作表和第二个 ftps,因此工作表数组无法设置 ftpExists 值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 2021-07-25
    • 2020-09-28
    • 2017-11-30
    • 2016-06-11
    相关资源
    最近更新 更多