簡體   English   中英

根據用戶輸入過濾對象數組值

[英]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和使用filterindexOf函數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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM