我有两个非常长的数组,包含“图片名称”和“图片文件”。第一个表示图片的实际名称,而第二个表示文件名。例如:
picturenames[0] = '0 - zero';
picturenames[1] = '1 - one';
picturenames[2] = '1 o\'clock';
...
picturefiles[0] = 'numbers-zero.jpg';
picturefiles[1] = 'numbers-one.jpg';
picturefiles[2] = 'time-1.jpg';
...
我在每个阵列中有大约1000个项目有多种语言(图片文件总是相同的)。我正在从以前的应用程序“回收”这些数组,以节省一些时间并避免重新编写所有内容。
理想的功能:在文本框中使用用户的输入我想过滤picturenames
数组,然后显示相应的picturefiles
图片。
我面临的问题:当我过滤picturenames
数组时,我丢失了索引而无法“到达”图片文件名。
这是我用来过滤picturenames
数组的代码。
var matches = picturenames.filter(function(windowValue){
if(windowValue) {
return windowValue.indexOf(textToFindLower) >= 0;
}
});
最好的方法是什么?
更新:Ahmed提出的解决方案是最好的,但由于时间原因和可忽略的性能问题,我只是使用for循环来搜索数组,如下所示:
var matchesCounter = new Array();
for (i = 0; i < picturenames.length; i++) {
if (picturenames[i].indexOf(textToFindLower) >= 0) {
matchesCounter.push(i);
}
}
console.log(matchesCounter);
for (i = 0; i < matchesCounter.length; i++) {
console.log(picturenames[i]);
console.log(picturefiles[i]);
}
答案 0 :(得分:4)
试试这个:
const foundIndicies = Object.keys(picturenames).filter(pictureName => {
pictureName.includes(textToFindLower)
});
// reference picturefiles[foundIndicies[0]] to get the file name
尽管如此,将名称和文件放在一个对象中会更好,如下所示:
const pictures = [
{
name: '0 - zero',
file: 'numbers-zero.jpg',
},
{
name: '1 - one',
file: 'numbers-one.jpg',
}
];
const foundPictures = pictures.filter(picture => picture.name.includes('zero'));
if (foundPictures[0]) console.log(foundPictures[0].file);
答案 1 :(得分:2)
您可以在过滤时间内添加一个属性index
,稍后您可以使用index
。
var matches = picturenames.filter(function(windowValue, index){
if(windowValue) {
windowValue.index = index;
return windowValue.comparator(textToFindLower) >= 0;// Need to define comparator function
}
});
稍后您可以使用以下内容进行访问:
picturefiles[matches[0].index]
但是,该解决方案将适用于对象,而不是基本类型字符串。
如果您的数据类型是字符串,则必须转换为对象并将字符串作为属性值(如name
)。摘录如下:
var picturenames = [];
var picturefiles = [];
picturenames.push({name:'0 - zero'});
picturenames.push({name:'1 - one'});
picturenames.push({name:'1 o\'clock'});
picturefiles.push({name:'numbers-zero.jpg'});
picturefiles.push({name:'numbers-one.jpg'});
picturefiles.push({name: 'time-1.jpg'});
var textToFindLower = "0";
var matches = picturenames.filter(function(windowValue, index){
if(windowValue) {
windowValue.index = index;
return windowValue.name.indexOf(textToFindLower) >= 0;
}
});
console.log(matches);