簡體   English   中英

如何使用地圖或過濾器將代碼重構為Javascript ES6?

[英]How can I refactor my code to Javascript ES6 using map or filter?

此函數將驅動程序對象數組作為第一個參數,並將JavaScript對象指定一個屬性和相應的值。 例如, exactMatch(drivers, { revenue: 3000 })將返回所有收入屬性等於3000的exactMatch(drivers, { name: 'Bob' })exactMatch(drivers, { name: 'Bob' })將返回其name屬性等於Bob的所有驅動程序。

我嘗試使用地圖和過濾器進行設置,但均未成功。 我試圖用帶有映射或過濾器的ES6格式重寫此代碼,否則只是重構以獲得更好的代碼。 任何幫助,將不勝感激! 一般來說,我對編程和JS非常陌生。

function exactMatch(drivers, obj){
  const driverMatch = [];
  for (const driver of drivers){
    for (const key in obj){
      if (driver[key] === obj[key]){
        driverMatch.push(driver);
      }
    }
  }
  return driverMatch;
}

重構以獲得更好的代碼並使用JS ES6。

我只是從第二個參數生成一個謂詞。 由於它包含一個鍵和一個值,因此Object.entries會將其分解為那些鍵和值,您可以從中生成一個謂詞,該謂詞可以在每個鍵值對上簡單地運行Array#every來檢查對象是否與每個鍵值對匹配:

 const makePredicate = template => { const keyValues = Object.entries(template); return obj => keyValues.every(([key, value]) => obj[key] === value) } const predicate = makePredicate({name: "Bob"}); const a = {name: "Alice"}; const b = {name: "Bob"}; console.log(predicate(a)); console.log(predicate(b)); 

因此,之后可以直接在Array#filter使用此謂詞:

 const makePredicate = template => { const keyValues = Object.entries(template); return obj => keyValues.every(([key, value]) => obj[key] === value) } const drivers = [{ name: "Alice", revenue: 20000, colour: "red" }, { name: "Bob", revenue: 10000, colour: "blue" }, { name: "Carol", revenue: 10000, colour: "red" } ] console.log(drivers.filter(makePredicate({ name: "Bob" }))); console.log(drivers.filter(makePredicate({ revenue: 10000, colour: "red" }))); 

如果只想匹配至少一個提供的鍵值,則可以交換並使用Array#some

 const makePredicate = template => { const keyValues = Object.entries(template); return obj => keyValues.some(([key, value]) => obj[key] === value) // ^^^^ } const drivers = [{ name: "Alice", revenue: 20000, colour: "red" }, { name: "Bob", revenue: 10000, colour: "blue" }, { name: "Carol", revenue: 10000, colour: "red" } ] console.log(drivers.filter(makePredicate({ name: "Bob" }))); console.log(drivers.filter(makePredicate({ revenue: 10000, colour: "red" }))); 

您可以預先獲取obj的條目並過濾數組,並使用Array#some檢查一個鍵/值對是否匹配。

// one property match
function exactMatch(drivers, obj) {
    var entries = Object.entries(obj);
    return drivers.filter(driver => entries.some(([k, v]) => driver[k] === v));
}

對於應該匹配的所有屬性,您可以使用Array#every

// all properties have to match
function exactMatch(drivers, obj) {
    var entries = Object.entries(obj);
    return drivers.filter(driver => entries.every(([k, v]) => driver[k] === v));
}

簡短答案:

function exactMatch(drivers, obj) {
  return drivers.filter(driver => {
    const truths = Object.keys(obj).map(k => driver[k] === obj[k])
    return truths.filter(Boolean).length === truths.length
  })
}

您可以通過多種方法來執行此操作,但這是我想到的第一種方法。 假設您可以傳遞一個{ name: 'Bob', salary: 20000 }類的obj { name: 'Bob', salary: 20000 }並且要求這兩個條件都為真。

 const exampleData = { drivers: [ { name: 'Bob', revenue: 5000, }, { name: 'Alice', revenue: 3000 }, { name: 'Allen', revenue: 4000 }, { name: 'Monkey', revenue: 5000 } ] }; // Finds the first occurance function exactMatch(exampleData, target) { const targetKey = Object.keys(target)[0] const targetValue = Object.values(target)[0] return exampleData.drivers.find(driver => driver[targetKey] === targetValue) } // Finds all of the data that met the condition function matchAll(exampleData, target) { const targetKey = Object.keys(target)[0] const targetValue = Object.values(target)[0] return exampleData.drivers.filter(driver => driver[targetKey] === targetValue) } const resultA = exactMatch(exampleData, {revenue: 4000}) console.log(resultA) const resultB = matchAll(exampleData, {revenue: 5000}) console.log(resultB) 

暫無
暫無

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

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