如何检查数组中是否已存在某个文件名?例如,在初始加载时,我从服务器获取一些文件:
var initialFiles = ['file1_1','file2_0','file3_3','file4_2','file5_6'];
我将它们推送到一个数组并设置在sessionStorage中:
filesArray.push(initialFiles);
sessionStorage.setItem('file-names', JSON.stringify(filesArray));
然后,当用户与网站交互后,我会收到更多文件:
var newFiles = ['file1_1', 'file2_0', 'file1_2', 'file3_5', 'file4_6'];
您可以看到已加载file1_1
和file2_0
。我怎么不在数组中添加这些文件名?
答案 0 :(得分:1)
您可以使用indexOf == -1
检查新数组中的每个文件是否都在旧数组中小提琴:https://jsfiddle.net/L42h7uhm/
var initialFiles = ['file1_1', 'file2_0', 'file3_3', 'file4_2', 'file5_6'];
var newFiles = ['file1_1', 'file2_0', 'file1_2', 'file3_5', 'file4_6'];
newFiles.forEach(function (file) {
console.log(initialFiles.indexOf(file) == -1);
});
答案 1 :(得分:1)
您可以连接两个数组并过滤掉非唯一项目。
var initialFiles = ['file1_1', 'file2_0', 'file3_3', 'file4_2', 'file5_6'];
var newFiles = ['file1_1', 'file2_0', 'file1_2', 'file3_5', 'file4_6'];
var newArray = initialFiles.concat(newFiles);
var uniqueArray = newArray.filter(function(item, pos) {
return newArray.indexOf(item) == pos;
});
console.log(uniqueArray);
答案 2 :(得分:0)
使用ES6语义(现代浏览器,转换代码或最新的node.js),您可以更有效地使用Set
对象,该对象将自动保留重复项。
var files = new Set(['file1_1','file2_0','file3_3','file4_2','file5_6']);
var newFiles = ['file1_1', 'file2_0', 'file1_2', 'file3_5', 'file4_6'];
files.add(...newFiles);
sessionStorage.setItem('file-names', JSON.stringify(Array.from(files)));
工作演示:http://jsfiddle.net/jfriend00/7d1dy1p7/
MDN reference on the Set object
而且,Set对象也有很多polyfill,因为它是一个普遍有用的概念,特别是对于这样的事情。这是我创建的一个:Mimicking sets in JavaScript?
或者,如果您试图找出newFiles
列表中的哪些项目实际上是新项目而不是files
列表中的项目,那么您可以这样做。
var files = new Set(['file1_1','file2_0','file3_3','file4_2','file5_6']);
var newFiles = ['file1_1', 'file2_0', 'file1_2', 'file3_5', 'file4_6'];
var uniqueNewFiles = newFiles.filter(function(item) {
return !files.has(item);
});
然后,在更新现有文件列表之后,您可以将其添加到其中:
files.add(...uniqueNewFiles);
或者,使用功能更强大的Set object,您可以这样做:
var files = new Set(['file1_1','file2_0','file3_3','file4_2','file5_6']);
var newFiles = new Set(['file1_1', 'file2_0', 'file1_2', 'file3_5', 'file4_6']);
var uniqueNewFiles = newFiles.difference(files);