使用节点js打印数组中可用的差异值

print difference value available in array using node js

我不知道这怎么可能我想打印包含相同值和差异值的数组。

我想检查两个数组中是否存在该值(如果存在)然后将其打印在一个数组中,该数组包含两个数组的所有相同值和另一个包含不同名称的数组。

readFileArray:
[
  [
    mainFolder/abc_doc.txt, 
    mainFolder/pqr_doc.txt, 
    mainFolder/subFolder/xyz_image.jpg,
    mainFolder/subFolder/iop_pdf.pdf,
  ],
  [
    Fish,
    Life,
    Qwerty,
    Moon
  ]
]
comparePathName:
[
  mainFolder/abc_doc.txt, 
  mainFolder/pqr_doc.txt,
  mainFolder/subFolder/xyz_image.jpg, 
  mainFolder/subFolder/iop_pdf.pdf, 
  mainFolder/fish.txt, 
  mainFolder/life.txt,
  mainFolder/subFolder/qwerty.jpg, 
  mainFolder/subFolder/moon.pdf, 
]

代码:

for (let i = 0; i <= readFileArray.length - 1; i++) {
      for (let j = 0; j < readFileArray[i].length - 1; j++) {
        if (readFileArray[i][j] === comparePathName) {
          availableName = readFileArray[1][j];
           if (typeof availableName !== undefined) {
             console.log(availableName)
           }
        }
      }
    }

输出: 我在 availableName

中得到的数组中存在的值
availableName= 
[
  mainFolder/abc_doc.txt, 
  mainFolder/pqr_doc.txt,
  mainFolder/subFolder/xyz_image.jpg,
  mainFolder/subFolder/iop_pdf.pdf,
]

现在我还需要新数组中的非相似值,其名称为 expectedArray

expectedArray=
[
  mainFolder/fish.txt,  
  mainFolder/life.txt, 
  mainFolder/subFolder/qwerty.jpg, 
  mainFolder/subFolder/moon.pdf, 
]

我们可以创建如下函数来获取两个数组的交集和差集,然后通过传递相关值来调用它们。

我决定使用 Set.has rather than Array.includes 来提高性能(尽管这只会对非常大的数组产生影响)

const readFileArray = [ [ 'mainFolder/abc_doc.txt', 'mainFolder/pqr_doc.txt', 'mainFolder/subFolder/xyz_image.jpg', 'mainFolder/subFolder/iop_pdf.pdf', ], [ 'Fish', 'Life', 'Qwerty', 'Moon' ] ]  
const comparePathName = [ 'mainFolder/abc_doc.txt', 'mainFolder/pqr_doc.txt', 'mainFolder/subFolder/xyz_image.jpg', 'mainFolder/subFolder/iop_pdf.pdf', 'mainFolder/fish.txt', 'mainFolder/life.txt', 'mainFolder/subFolder/qwerty.jpg', 'mainFolder/subFolder/moon.pdf', ] 

/* Return all the items in one array only, use sets to avoid N squared behaviour */
function getSymmetricDifference(array1, array2) {
    const set1 = new Set(array1);
    const set2 = new Set(array2);

    const itemsInArray1Only = array1.filter(el => !set2.has(el))
    const itemsInArray2Only = array2.filter(el => !set1.has(el))

    return itemsInArray1Only.concat(itemsInArray2Only)
}

/* Return all common items, use set to avoid N squared behaviour */
function getIntersection(array1, array2) {
    const set2 = new Set(array2);
    return array1.filter(el => set2.has(el));
}


console.log("Intersection:", getIntersection(readFileArray[0], comparePathName))
console.log("Difference:", getSymmetricDifference(readFileArray[0], comparePathName))

一个简单的方法是使用 array.filter and includes 方法:

为了获取公共值,filter 将迭代第一个数组,includes 将检查第二个数组的当前值。要获得差异,请检查是否在第二个数组中找不到当前值。

let availableName = readFileArray[0].filter(value => comparePathName.includes(value))

let expectedArray = comparePathName.filter(value => !readFileArray[0].includes(value))

当然,要获得所有不同的值,您需要通过在上面的代码中切换数组来进行双向过滤,然后合并结果。或者简单地检查哪个数组有更多元素并将其用于过滤器。

简单例子:

let readFileArray = [
  [
    'mainFolder/abc_doc.txt', 
    'mainFolder/pqr_doc.txt', 
    'mainFolder/subFolder/xyz_image.jpg',
    'mainFolder/subFolder/iop_pdf.pdf',
  ],
  [
    'Fish',
    'Life',
    'Qwerty',
    'Moon'
  ]
]

let comparePathName = [
  'mainFolder/abc_doc.txt',
  'mainFolder/pqr_doc.txt',
  'mainFolder/subFolder/xyz_image.jpg', 
  'mainFolder/subFolder/iop_pdf.pdf', 
  'mainFolder/fish.txt', 
  'mainFolder/life.txt',
  'mainFolder/subFolder/qwerty.jpg', 
  'mainFolder/subFolder/moon.pdf', 
]

let availableName = readFileArray[0].filter(value => comparePathName.includes(value))
let expectedArray = comparePathName.filter(value => !readFileArray[0].includes(value))

console.log('Common', availableName)
console.log('Different', expectedArray)