簡體   English   中英

使用ES6 / lodash進行迭代和過濾

[英]Iterating and filtering with ES6/lodash

我們有一系列對象,如:

const persons = [{
    name: "john",
    age: 23
}, {
    name: "lisa",
    age: 43
}, {
    name: "jim",
    age: 101
}, {
    name: "bob",
    age: 67
}];

以及對象中對象的屬性值數組

const names = ["lisa", "bob"]

我們如何使用es6在names數組中找到名字的人,如:

const filteredPersons = [{
    name: "lisa",
    age: 43
}, {
    name: "bob",
    age: 67
}];

ES6

使用帶謂詞的filter函數,並在其中檢查names數組中是否存在names

 const persons = [ {name: "john", age:23}, {name: "lisa", age:43}, {name: "jim", age:101}, {name: "bob", age:67} ]; const names = ["lisa", "bob"]; const filtered = persons.filter(person => names.includes(person.name)); console.log(filtered); 

您可以使用filter()inlcudes()來獲取所需的結果。

DEMO

 const persons = [{ name: "john", age: 23 }, { name: "lisa", age: 43 }, { name: "jim", age: 101 }, { name: "bob", age: 67 }]; const names = ["lisa", "bob"]; console.log(persons.filter(({ name }) => names.includes(name))) 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

我建議使用indexOf因為includes在IE瀏覽器中不起作用。 此外,使用{name}作為Destructuring賦值,它將保存對象的name屬性的值。

 const persons = [{ name: "john", age: 23 }, { name: "lisa", age: 43 }, { name: "jim", age: 101 }, { name: "bob", age: 67 }]; const names = ["lisa", "bob"]; console.log(persons.filter(({name}) => names.indexOf(name) !== -1)) 

lodash

你可以嘗試以下

 const persons = [{name: "john", age: 23}, {name: "lisa",age: 43}, {name: "jim", age: 101}, {name: "bob",age: 67}]; const names = ["lisa", "bob"] const filteredPersons = _.filter(persons, function(person) { return _.indexOf(names, person.name) !== -1; }); console.log(filteredPersons); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script> 

如果你想在執行它n復雜,這里是一個辦法做到這一點:

  1. 使用鍵創建一個地圖,將人的姓名和值作為人物的對象。
  2. 映射條件數組並從步驟1中的地圖創建中提取人物對象。

這是一個有效的演示:

 const persons = [{ name: "john", age: 23 }, { name: "lisa", age: 43 }, { name: "jim", age: 101 }, { name: "bob", age: 67 }]; const names = ["lisa", "bob"]; const map = persons.reduce((acc, item) => { acc[item.name] = item; return acc; }, {}); const result = names.map(name => map[name]); console.log(result); 

注意:此解決方案假定源數組中只有唯一的人名。 需要調整它來處理重復項。

有關詳細信息,請參閱ClosuresSetArray.prototype.filter()

 // Input. const persons = [{name: "john",age: 23}, {name: "lisa",age: 43}, {name: "jim",age: 101}, {name: "bob",age: 67}] const names = ["lisa", "bob"] // Filter. const filter = (A, B) => (s => A.filter(x => s.has(x.name)))(new Set(B)) // Output. const output = filter(persons, names) // Proof. console.log(output) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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