反向过滤数组 Angular

Reverse filtered array Angular

我有一个像 ['a','b','c','d','e','f'] 这样的数组,我只想反转我之前过滤的一部分,例如我过滤并得到 ['c','d','e'] 然后我反转,最后的结果是我预期是 ['a','b','e','d','c','f'].

我试过 array.slice().filter(condition).reverse() 和 Whosebug 的另一种解决方案,但没有人适合我。

有什么想法吗?

如果您知道要反转的子数组的起始索引和长度

const arr = ['a','b','c','d','e','f'];

function reverse(arr, i, j){
    while(i <j){
      const temp = arr[i]
      arr[i]=arr[j];
      arr[j]=temp;
      i++;
      j--;
    }
   return arr;
}

const result = reverse(arr, 2, 4) 
console.log(result)  //  ["a", "b", "e", "d", "c", "f"]

上面的代码将以 O(n) 的时间复杂度解决您的问题

解决您的问题的一个快速方法是获取您已过滤的索引数组,并将这些索引替换为反向值。看这个例子:

const array = ['a', 'b', 'c', 'd', 'e', 'f'];
const indexHolder = [];

const filterValues = ['c', 'd', 'e']

const filtered = array
  .slice()
  .filter((item, index) => {
    const shouldFilter = filterValues.includes(item);

    if (shouldFilter) {
      indexHolder.push(index);
    }

    return shouldFilter;
  })
  .reverse();

const result = array.map((item, index) => {
  const foundIndex = indexHolder.indexOf(index);
  if (foundIndex >= 0) {
    // found, so we need the reversed
    return filtered[indexHolder.indexOf(index)];
  }

  return item;
});
console.log(result);

一个快速的解决方案是遍历数组两次。一次清除您需要的框,一次反向填充它们。

var x = ['a', 'b', 'c', 'd', 'e', 'f'];
var cond = ['b', 'd', 'e'];
var filtered = [];

for (let i = 0; i < x.length; i++) {
  if (cond.indexOf(x[i]) !== -1) {
    filtered.push(x[i]);
    x[i] = null;
  }
}
var counter = 0;
for (let i = x.length; i >=0; i--) {
  if (x[i] === null) {
    x[i] = filtered[counter];
    counter++;
  }
}

console.log(x);

我的回答基本上是对 Bas 的模仿,具有一些不同的格式,以防您想使用函数。但所有功劳都归功于 Bas,他为我的解决方案做了腿部工作。

ngOnInit() {
   const array = ['a', 'b', 'c', 'd', 'e', 'f'];
   const filterValues = ['c', 'd', 'e']

   console.log(this.resultFn(array, filterValues));
}

resultFn(array, filterValues) {
  const indexHolder = [];
  const filtered = this.filteredFn(array, filterValues, indexHolder);

  return array.map((item, index) => {
    const foundIndex = indexHolder.indexOf(index);
    if (foundIndex >= 0) {
      // found, so we need the reversed
      return filtered[indexHolder.indexOf(index)];
    }

    return item;
  });
}

filteredFn(array, filterValues, indexHolder) {
  return array
    .slice()
    .filter((item, index) => {
      const shouldFilter = filterValues.includes(item);

      if (shouldFilter) {
        indexHolder.push(index);
      }

      return shouldFilter;
    })
    .reverse();
}