如何使用另一个数组的内容过滤数组?

时间:2019-12-03 10:51:28

标签: javascript filter

代码如下:

inputArray = [
    { name: 'file1.jpg' },
    { name: 'file1.jpg' },
    { name: 'file2.jpg' },
    { name: 'file3.jpg' },
    { name: 'file4.jpg' }
]

filteringArray = ['file1', 'file2']

const outputArray = inputArray.filter( ? )

我需要过滤inputArrat,以便outputArray只包含对象,这些对象的文件名('name'属性)位于filterArray中。

outputArray = [
    { name: 'file1.jpg' },
    { name: 'file2.jpg' }
]

到目前为止,我已经在较简单的过滤条件下工作,但是我不确定如何解决这个问题。

3 个答案:

答案 0 :(得分:4)

如果对象名称以数组中存在的文件名开头,则可以将.some().starsWith()一起使用,以返回true

const inputArray = [
    { name: 'file1.jpg' },
    { name: 'file2.jpg' },
    { name: 'file3.jpg' },
    { name: 'file4.jpg' }
];

const filteringArray = ['file1', 'file2'];
const outputArray = inputArray.filter(({name}) => filteringArray.some(file => name.startsWith(file)));

console.log(outputArray);

如果您正在寻找时间复杂度更高(并且没有重复项)的解决方案,则可以创建Map,该解决方案将前缀文件名存储为键,将文字对象存储为值。然后,您可以使用以下地图.map() filteringArray

const inputArray = [
    { name: 'file1.jpg' },
    { name: 'file1.jpg' },
    { name: 'file2.jpg' },
    { name: 'file3.jpg' },
    { name: 'file4.jpg' }
]

const filteringArray = ['file1', 'file2'];
const lut = new Map(inputArray.map(({name}) => [name.split('.').shift(), {name}]));
const outputArray = filteringArray.map(f => lut.get(f));

console.log(outputArray);

答案 1 :(得分:1)

您可以使用过滤器和包含项的组合!

const inputArray = [
    { name: 'file1.jpg' },
    { name: 'file2.jpg' },
    { name: 'file3.jpg' },
    { name: 'file4.jpg' }
]

const filteringArray = ['file1', 'file2']

const outputArray = inputArray.filter((person) => filteringArray.includes(person.name.split(".")[0]))

console.log(outputArray);

答案 2 :(得分:1)

您可以使用一个简单的函数使用以下过滤器逻辑数组项在数组中执行过滤操作。

var outputArray = [];
var inputArray = [
    { name: 'file1.jpg' },
    { name: 'file1.jpg' },
    { name: 'file2.jpg' },
    { name: 'file3.jpg' },
    { name: 'file4.jpg' }
];

var filteringArray = ['file1', 'file2'];

function filterItems(arr, query) {
  arr.filter(function(el) {
    query.forEach(function(item){
      if(el.name.toLowerCase().indexOf(item.toLowerCase()) !== -1){
        outputArray.push(el.name);
      }
    });      
  });
}

filterItems(inputArray, filteringArray);

console.log(remove_duplicates(outputArray));

function remove_duplicates(arr) {
    var obj = {};
    var ret_arr = [];
    for (var i = 0; i < arr.length; i++) {
        obj[arr[i]] = true;
    }
    for (var key in obj) {
        ret_arr.push(key);
    }
    return ret_arr;
}

注意:更新了代码,现在输入数组具有重复的值。在输出数组中,没有重复项,因为我使用函数(Remove duplicate values from JS array)删除了重复项