[英]Filter Object Array values based on user input
我想根據用戶輸入過濾對象數組值。
這是jsfiddle :
// Copied from https://github.com/tc39/proposal-object-values-entries/blob/master/polyfill.js const reduce = Function.bind.call(Function.call, Array.prototype.reduce); const isEnumerable = Function.bind.call(Function.call, Object.prototype.propertyIsEnumerable); const concat = Function.bind.call(Function.call, Array.prototype.concat); const keys = Reflect.ownKeys; if (!Object.values) { Object.values = function values(O) { return reduce(keys(O), (v, k) => concat(v, typeof k === 'string' && isEnumerable(O, k) ? [O[k]] : []), []); }; } // Copied code ends here; let data = { Belgien: [{ code: "BRU", name: "Bryssel", aliases: "Bryssel,BRU,Belgien" }], Cypern: [{ code: "LCA", name: "Larnaca", aliases: "Larnaca,LCA,Cypern,Ayia Napa,Protaras,Fig Tree Bay,Larnaca" }, { code: "PFO", name: "Paphos", aliases: "Paphos,PFO,Cypern" } ] } let userInput = "lar"; let filteredData = Object.values(data).map(values => values.filter(value => value.name.toLowerCase().indexOf(userInput) !== -1)); console.log(filteredData);
問題是我得到了正確過濾的值,但沒有得到與這些值關聯的鍵,在本例中為國家。
提前致謝。
您可以使用函數reduce
和使用filter
和indexOf
函數filter
數據。
此替代方法使用函數Object.keys
來恢復所需的密鑰。
let data = { Belgien: [{ code: "BRU", name: "Bryssel", aliases: "Bryssel,BRU,Belgien" }], Cypern: [{ code: "LCA", name: "Larnaca", aliases: "Larnaca,LCA,Cypern,Ayia Napa,Protaras,Fig Tree Bay,Larnaca" }, { code: "PFO", name: "Paphos", aliases: "Paphos,PFO,Cypern" } ]}, userInput = "lar", filteredData = Object.keys(data).reduce((a, k) => { a[k] = data[k].filter(({name}) => name.toLowerCase().indexOf(userInput) > -1); return a; }, {}); console.log(filteredData);
.as-console-wrapper { max-height: 100% !important; top: 0; }
您可以遍歷鍵並返回僅包含過濾數據的對象。
var data = { Belgien: [{ code: "BRU", name: "Bryssel", aliases: "Bryssel,BRU,Belgien" }], Cypern: [{ code: "LCA", name: "Larnaca", aliases: "Larnaca,LCA,Cypern,Ayia Napa,Protaras,Fig Tree Bay,Larnaca" }, { code: "PFO", name: "Paphos", aliases: "Paphos,PFO,Cypern" }] }, userInput = "lar", filteredData = Object.keys(data).reduce((r, k) => { var temp = data[k].filter(({ name }) => name.toLowerCase().includes(userInput)); if (temp.length) { r[k] = temp; } return r; }, {}); console.log(filteredData);
.as-console-wrapper { max-height: 100% !important; top: 0; }
您可以像這樣使用Object.entries完成工作:
let filteredData = Object.entries(data).reduce((acc, values) => {
const value = values[1].filter(value =>
value.name.toLowerCase().indexOf(userInput) !== -1),
key = values[0];
acc[key] = value;
return acc;
}, {});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.