如何在不丢失索引的情况下过滤数组?

时间:2018-03-26 02:03:00

标签: javascript arrays filter

我有两个非常长的数组,包含“图片名称”和“图片文件”。第一个表示图片的实际名称,而第二个表示文件名。例如:

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]);
        }

2 个答案:

答案 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);