反向过滤数组Angular



我有一个类似['a','b','c','d','e','f']的数组,我只想反转我以前筛选过的部分,例如,我筛选得到['c','d','e'],然后反转,我期望的最终结果是['a','b','e','d','c','f']

我试过做array.slice().filter(condition).reverse(),以及stackoverflow的另一个解决方案,但没有人为我工作

知道吗?

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

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的模仿,如果你想使用函数,可以使用一些不同的格式。但所有的功劳都归功于巴斯为我的解决方案做了大量的工作。

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

最新更新