一個表格的過濾篩選,可能涉及多個篩選條件,this.filter
裡面存的是所有篩選條件的v-model狀態的一個對象,this.tableData
是從後端取得的所有原始表格資料的數組,this.filteredTableData
是過濾後的表格資料的陣列。
filterTableData() {
this.filteredTableData = this.tableData.map((item, index) => {
Object.keys(this.filter).forEach(key => {
if (this.filter[key] && item[key] && item[key] === this.filter[key]) {
console.log(item)
return item
}
})
})
console.log(this.filteredTableData)
// this.paginateTableData()
},
這樣寫,會使得第二個console.log(this.filteredTableData)
拿到一個全部是undefined
的陣列。這樣的錯誤應該是因為forEach沒辦法用return 跳出迴圈。
所以我想知道:
在使用map 且map內部最好不使用變數(使用也行吧,只是擔心效能)的情況下,如何實作這個函數?
如果this.filteredTableData
的資料量特別大,有沒有什麼更好的辦法?
PHP中文网2017-05-19 10:23:54
filter較為恰當。
另外,加一個變數就會影響效能的觀點從何而來。不要在還沒出現任何效能問題之時就靠猜測它會有效能問題。
要嘛你就用普通的for迴圈代替,要嘛就得在forEach外面定義一個bool值來判斷。
phpcn_u15822017-05-19 10:23:54
我之前遇到過使用map 和forEach 帶來的問題,後來都合理的使用for...in 和for...of 來解決掉了,你是不是可以換一下思路,不一定要用map 和forEach 來解決。
習慣沉默2017-05-19 10:23:54
不要再forEach裡用this
filterTableData() {
var that = this;
this.filteredTableData = this.tableData.map((item, index) => {
Object.keys(that.filter).forEach(key => {
if (that.filter[key] && item[key] && item[key] === that.filter[key]) {
console.log(item)
return item
}
})
})
console.log(this.filteredTableData)
// this.paginateTableData()
},
巴扎黑2017-05-19 10:23:54
我回答你陣列裡都是undefined
的問題吧。
你在map函數裡 沒有return
當然就不會有回傳值啊,沒有顯示的回傳值當然是undefined。
相當於你遍歷的結果沒有回傳 做了無用功。
map的回呼函數不該這麼寫麼?
(item, index) => {
return Object.keys(this.filter).forEach(key => {
if (this.filter[key] && item[key] && item[key] === this.filter[key]) {
console.log(item)
return item
}
})
}
當我沒有回答吧,又看了一遍,你是知道這個問題的。 return Object.keys(this.filter) 這對你來說沒有意義。
還是需要使用個中間變數的,如:
this.filteredTableData = this.tableData.map((item, index) => {
var _item;
Object.keys(this.filter).forEach(key => {
if (this.filter[key] && item[key] && item[key] === this.filter[key]) {
console.log(item)
_item = item;
// return item
}
})
return _item
})
// 你要考虑声明变量的性能损失的话 可以在外层声明好 用完 释放掉。
var _item;
this.filteredTableData = this.tableData.map((item, index) => {
Object.keys(this.filter).forEach(key => {
if (this.filter[key] && item[key] && item[key] === this.filter[key]) {
console.log(item)
_item = item;
// return item
}
})
return _item
})
_item = null
漂亮男人2017-05-19 10:23:54
不知道你是不是這個意思。
filterTableData () {
this.filteredTableData = this.tableData.filter((item, index) => {
return Object.keys(this.filter).some(key => this.filter[key] && item[key] && item[key] === this.filter[key])
})
console.log(this.filteredTableData)
// this.paginateTableData()
}