typescript JavaScript帮助比较数组,并获得两个新数组,它们具有不同的格式,并根据需要添加了空格

cxfofazt  于 2023-03-13  发布在  TypeScript
关注(0)|答案(2)|浏览(118)

我正在创建一个Angular应用程序,需要TypeScript/JavaScript方面的帮助。

我有两个字符串数组

| 阵列1|阵列2|
| - ------|- ------|
| 二○二三年三月三十日|二○二三年三月三十日|
| 二零二三年三月三十一日|二○二三年四月十四日|
| 二○二三年四月十四日|二〇二三年六月三十日|
| 二○二三年四月二十五日|二零二三年七月三十一日|
| 二〇二三年六月三十日||
我尝试比较Array 1和Array 2,并创建两个新的字符串数组Array 3和Array 4。

创建数组3和数组4时:

如果数组1和数组2具有相同的值,则分别插入数组3和数组4。
如果Array 1有“3/31/2023”,并且它不在Array 2中,则在Array 3中插入“3/31/2030”,在Array 4中插入一个空字符串,反之亦然。
最后,数组3和数组4将具有相同的长度,并且它们可以并排显示在表中。
| 阵列3|阵列4|
| - ------|- ------|
| 二○二三年三月三十日|二○二三年三月三十日|
| 二零二三年三月三十一日|““|
| 二○二三年四月十四日|二○二三年四月十四日|
| 二○二三年四月二十五日|““|
| 二〇二三年六月三十日|二〇二三年六月三十日|
| ““|二零二三年七月三十一日|
仅供参考:Array 1和Array 2可以是任意长度,包括一个或两个都为空数组
我喜欢有解决方案使用RxJS,但是,不是必须的。任何帮助将是伟大的这一点。
非常感谢
我的尝试:
我尝试了使用for循环和if语句的解决方案。它在大多数情况下都有效,但不是所有情况下都有效。
此外,我的代码很长,有多个for和if语句。我更喜欢用rxjs寻找代码,不过,JavaScript代码也很棒。

代码:

//比较两个数组...当第一个数组中缺少某个元素时,则插入空白private addBlankToMissingEelement 2(array 1,array 2):数组{

//Deep clone to avoid array mutation
let arrTemp1 = Object.assign([], array1)
let arrTemp2 = Object.assign([], array2)

var arrTemp1Length = arrTemp1.length;
var arrTemp2Length = arrTemp2.length;
let arr1FirstElement = arrTemp1[0];

if (arrTemp1Length === 0 || arrTemp2Length === 0)
  return array1;

for (let i = 0; i < arrTemp1Length; i++) {
  for (let j = 0; j < arrTemp2Length; j++) {
    if (arrTemp1[i] == '' || arrTemp2[j] == '' || arrTemp1[i] == undefined || arrTemp2[j] == undefined) {
      break;
    }
    else if (arrTemp1[i] == arrTemp2[j]) {
      break;
    }
    else if (i == 0 && arr1FirstElement > arrTemp2[j]) { //Add blank to first array at the begining as many times as needed
      array1.unshift('');
      arrTemp1Length++;
    }
    else if (arrTemp1[i] != arrTemp2[j] && arrTemp1[i] < arrTemp2[j + 1]) {
      console.log("In last --- " + " [" + i + ", " + j + "] --- " + " --- " + arrTemp1[i] + " --- " + arrTemp2[j] + arrTemp2[j + 1]);
      array2.splice(j + 1, 0, '');
      arrTemp2Length++;
      break;
    }

  }
}

return array1;

}

2ic8powd

2ic8powd1#

在你的解决方案中,你使用了一个嵌套循环,在这个循环中你遍历第二个数组中的每个元素,但是你需要同时遍历两个数组。
下面是一个非常直接的解决方法,为每个数组保留一个索引,然后检查下一个值是哪个:

const array1 = [
  "12/12/2023",
  "3/30/2023",
  "3/31/2023",
  "4/14/2023",
  "4/25/2023",
  "6/30/2023",
];
const array2 = [
  "1/1/2024",
  "12/12/2023",
  "3/30/2023",
  "4/14/2023",
  "6/30/2023",
  "7/31/2023",
];

function toSortedDateArray(arr){
  return arr.map(s => new Date(s)).sort( (d1, d2) => d1 - d2 )
}

function buildRows(arr1, arr2){
  const dates1 = toSortedDateArray(arr1), dates2 = toSortedDateArray(arr2)
  const column1 = [], column2 = []
  let ix1 = 0, ix2 = 0
  while(ix1 < dates1.length || ix2 < dates2.length){
    const v1 = dates1[ix1], v2 = dates2[ix2]
    const useV1 = (!v2 || v1 - v2 <= 0), useV2 = (!useV1 || v1 - v2 === 0)
    column1.push(useV1 ? v1 : undefined)
    column2.push(useV2 ? v2 : undefined)
    useV1 && ix1++
    useV2 && ix2++
  }
  return [
    column1.map(date => date?.toLocaleDateString("en-US")), 
    column2.map(date => date?.toLocaleDateString("en-US"))
  ]
}

const res = buildRows(array1, array2)
console.log('rowise output:', res[0].map((v1,i) => [v1,res[1][i]]))
.as-console-wrapper { max-height: 100% !important; top: 0; }

下面是第二个版本,它首先构建一个日期列表,然后检查将每个日期放入哪一列。它可以使用任意数量的数组:
一个二个一个一个

fnx2tebb

fnx2tebb2#

试试这个算法

const array1 = [
    "3/30/2023",
    "3/31/2023",
    "4/14/2023",
    "4/25/2023",
    "6/30/2023"
];
const array2 = [
    "3/30/2023",
    "4/14/2023",
    "6/30/2023",
    "7/31/2023"
];
let m=array1.length;
let n=array2.length;
const array3: string[] =[];
const array4: string[] =[];
let i=0,j=0;
for(;i<m||j<n;) {
    if(array1[i]==array2[j]) {
        array3.push(array1[i++]);
        array4.push(array2[j++]);
    }
    else if(array2[j]==undefined || array1[i]<array2[j]) {
        array3.push(array1[i++]);
        array4.push("");
    }
    else if(array1[i]==undefined || array1[i]>array2[j]) {
        array3.push("");
        array4.push(array2[j++]);
    }
}

console.log(array3);
console.log(array4);

相关问题