根据其他两个数组有效地过滤数组

时间:2018-01-15 16:59:52

标签: javascript arrays filter

我的数据可以用这三个数组进行简单解释(尽管规模要大得多):

var arrayOfVariables = ['var1', 'var2', 'var3', 'var4'];
var arrayWithValues = [20, 10, 30, 40];
var arrayToFilter = ['var1', 'var3'];

理想情况下,我想过滤arrayToFilter并查看它是否包含来自arrayOfVariables的任何变量。如果他们这样做,我想使用他们的索引从arrayWithValues中获取一组正确的值。这意味着var1 = 20,var2 = 10,var3 = 30,var4 = 40.因为arrayToFilter包含var1 och var 3,我的最后一个数组将是:

var output = [20, 30];

有没有人知道这是否有效,最好不要使用for-loops或类似方法。也许filter / map / reduce?

*更新*

var arrayOfVariables = ['var3', 'var2', 'var1', 'var4'];
var arrayWithValues = [30, 10, 20, 40];
var arrayToFilter = ['var1', 'var3'];

如果我要将数组的顺序更改为上面,我仍然希望输出[20,30]。这意味着我希望在arrayToFilter之后排序的值:首先是var1(20)然后是var3(30)。

3 个答案:

答案 0 :(得分:4)

您可以通过获取索引来过滤值,并查看值是否在过滤器数组中。



var variables = ['var1', 'var2', 'var3', 'var4'],
    values = [20, 10, 30, 40],
    filter = ['var1', 'var3', 'foo'],
    result = values.filter((_, i) => filter.includes(variables[i]));
    
console.log(result);




Array#map的版本。它仅适用于variables中的现有值。



var variables = ['var1', 'var2', 'var3', 'var4'],
    values = [20, 10, 30, 40],
    filter = ['var1', 'var3', 'foo'],
    result = filter.map(f => values[variables.indexOf(f)]);
    
console.log(result);




使用Map 4castle 方法。



var variables = ['var1', 'var2', 'var3', 'var4'],
    values = [20, 10, 30, 40],
    filter = ['var1', 'var3'],
    map = new Map(variables.map((v, i) => [v, values[i]]))
    result = filter.map(f => map.get(f));
    
console.log(result);




答案 1 :(得分:3)

您可以使用reduce()方法执行此操作,并检查当前元素是否存在于您可以使用indexOf()的其他数组中,这也将为您提供该元素的索引。

var arrayOfVariables = ['var1', 'var2', 'var3', 'var4'];
var arrayWithValues = [20, 10, 30, 40];
var arrayToFilter = ['var1', 'var3'];

const result = arrayToFilter.reduce(function(r, e) {
  let i = arrayOfVariables.indexOf(e);
  if (i != -1) r.push(arrayWithValues[i])
  return r;
}, [])

console.log(result)

答案 2 :(得分:2)

您可以使用array.maparray.indexOf

var arrayOfVariables = ['var1', 'var2', 'var3', 'var4'];
var arrayWithValues = [20, 10, 30, 40];
var arrayToFilter = ['var1', 'var3'];

// map will return a new array
var m = arrayToFilter.map(function(item) {
  // for every element check if that element is present in arrayOfVariables 
  if (arrayOfVariables.indexOf(item) != -1) {
    // if present get the index and get the value from arrayWithValues
    return arrayWithValues[arrayOfVariables.indexOf(item)]
  }
  return x
})

console.log(m)