Javascript比较两个数组并获取不匹配的值

时间:2019-01-17 17:57:14

标签: javascript arrays

非常感谢您在此方面的所有帮助。

我有两个数组:

  • 第一个数组包含文件名,不带扩展名
  • 第二个数组包含具有扩展名的文件名。

我需要输出第三个数组,在这种情况下,FinalArray包含一个不在ArrayFileNameWExt数组中的所有ArrayFileName的列表。

我知道我在寻找匹配项上有一个话题,这很棒。但是我在寻找不匹配的物品时遇到了问题。我将==比较更改为!==,这给了我一个文件名一百次。

Maxine,谢谢您的帮助

var ArrayFileName = ['one', 'two', 'three', 'three', 'five', 'six', 'ten'];
var ArrayFileNameWExt = ['one.txt', 'two.txt', 'three.txt', 'ten.wmf', 'eleven.cgm'];
var FinalArray = [];

for (var i = 0; i < ArrayFileName.length; i++) {
    for (var j = 0; j < ArrayFileNameWExt.length; j++) {
        var temp = ArrayFileNameWExt[j].split(".");
        if(ArrayFileName[i]!==temp[0]){
            FinalArray.push(ArrayFileNameWExt[j]);
            break;
        }
    }
}

5 个答案:

答案 0 :(得分:2)

您可以使用简单的过滤器,并返回所有拆分第一部分不在ArrayFileName数组中的项。

var ArrayFileName = ['one', 'two', 'three', 'three', 'five', 'six', 'ten'];
var ArrayFileNameWExt = ['one.txt', 'two.txt', 'three.txt', 'ten.wmf', 'eleven.cgm'];

var final = ArrayFileNameWExt.filter(function(item) {
  return !ArrayFileName.includes(item.split('.')[0]);
})

console.log(final);

如果您使用的是JavaScript的较旧版本,则includes Array方法可能不存在。可以使用以下代码。

var ArrayFileName = ['one', 'two', 'three', 'three', 'five', 'six', 'ten'];
var ArrayFileNameWExt = ['one.txt', 'two.txt', 'three.txt', 'ten.wmf', 'eleven.cgm'];

var final = ArrayFileNameWExt.filter(function(item) {
  var name = item.split('.')[0];
  for (var i = 0; i < ArrayFileName.length; i++) {
    if (ArrayFileName[i] === name) return false;
  }
  return true;
})

console.log(final);

答案 1 :(得分:2)

重复使用您提供给我们的代码,我做到了:我互换了两个for循环,并使用变量(found)跟踪找到的项目。在外部循环中通过ArrayFileNameWExt进行迭代也更好,因为我们减少了对split函数的调用次数。

var ArrayFileName = ['one', 'two', 'three', 'three', 'five', 'six', 'ten'];
var ArrayFileNameWExt = ['one.txt', 'two.txt', 'three.txt', 'ten.wmf', 'eleven.cgm'];
var FinalArray = [];

for (var i = 0; i < ArrayFileNameWExt.length; ++i) {
    var temp = ArrayFileNameWExt[i].split(".");
    var found = false;
    
    for (var j = 0; j < ArrayFileName.length; ++j) {
        if (ArrayFileName[j] === temp[0]) {
            found = true;
            break;
        }
    }
    
    if (!found) {
        FinalArray.push(ArrayFileNameWExt[i]);
    }
}

console.log(FinalArray);

干杯!

答案 2 :(得分:1)

我会使用.filter.includes-

const fileNames =
  ['one', 'two', 'three', 'three', 'five', 'six', 'ten']

const fileNamesWExt =
  [ 'one.txt', 'two.txt', 'three.txt', 'ten.wmf', 'eleven.cgm' ]

const basename = filename =>
  filename.split(/\.[^.]+$/)[0]

const finalArray =
  fileNamesWExt.filter(f => ! fileNames.includes(basename(f)))
  
console.log(finalArray)
// [ 'eleven.cgm' ]

请注意我们对basename的实现,请注意仅删除最后一个扩展名-

const basename = filename =>
  filename.split(/\.[^.]+$/)[0]
  
console.log
  ( basename ("cat")               // "cat"
  , basename ("cat.dog")           // "cat"
  , basename ("cat.dog.eel")       // "cat.dog"
  , basename ("cat.dog.eel.fox")   // "cat.dog.eel"
  )

如果不能使用箭头功能,则可能使用的是JavaScript的旧版本。在这种情况下,您还需要填充.includes-

Array.prototype.includes = function (x, init) {
  for (var i = init || 0; i < this.length; i = i + 1)
    if (this[i] === x)
      return true;
  return false;
};

var fileNames =
  ['one', 'two', 'three', 'three', 'five', 'six', 'ten'];

var fileNamesWExt =
  [ 'one.txt', 'two.txt', 'three.txt', 'ten.wmf', 'eleven.cgm' ];

var basename = function (filename) {
  return filename.split(/\.[^.]+$/)[0];
};

var finalArray =
  fileNamesWExt.filter(function (f) {
    return ! fileNames.includes(basename(f));
  });
  
console.log(finalArray);
// [ 'eleven.cgm' ]

答案 3 :(得分:1)

也许编辑器会这样

var ArrayFileName = ['one', 'two', 'three', 'three', 'five', 'six', 'ten'];
var ArrayFileNameWExt = ['one.txt', 'two.txt', 'three.txt', 'ten.wmf', 'eleven.cgm'];
var FinalArray = [];

for (var i = 0; i < ArrayFileNameWExt.length; i++) {

    var matchFound = false;
    for (var j = 0; j < ArrayFileName.length; j++) {
    
        var temp = ArrayFileNameWExt[i].split(".");
        
        if(ArrayFileName[j]==temp[0]){
            matchFound = true;
            break;
        }
    }
    if(!matchFound){
      FinalArray.push(ArrayFileNameWExt[i])
    
    }
    
}

console.log(FinalArray)

答案 4 :(得分:0)

Array#filter使您可以包含(或删除)满足特定条件的元素。

Array#inludes返回数组中是否包含某些元素。

String#split返回一个数组,其中包含使用所需的分隔符(在本例中为点)分割字符串的元素。

var ArrayFileName = ['one', 'two', 'three', 'three', 'five', 'six', 'ten'];
var ArrayFileNameWExt = ['one.txt', 'two.txt', 'three.txt', 'ten.wmf', 'eleven.cgm'];
var FinalArray = [];

FinalArray = ArrayFileNameWExt.filter (filenameWExt => !ArrayFileName.includes(filenameWExt.split('.')[0]));

console.log(FinalArray);

任何其他问题请在评论中让我知道,我会解释