反向过滤数组 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();
}
我有一个像 ['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();
}