2017-07-15 17 views
1

你們能給我關於下一個任務的一些例子或鏈接:你可以複合過濾器的例子嗎?

var companies = [{ 
     members: [{ 
       name: 'John' 
      }, 
      { 
       name: 'Victor' 
      }, 
      { 
       name: 'Roan' 
      } 
     ] 
    }, 
    { 
     members: [{ 
       name: 'John' 
      }, 
      { 
       name: 'Roan' 
      } 
     ] 
    } 
] 

<input type='text'> 

當我鍵入「約翰和維克多」 - 我想公司[0]對象

當我輸入「約翰而不是維克多」 - 我想獲得公司[1]對象

問題是如何解析文本並使其理解我在哪裏和而不是? 希望我解釋得很好。 預先感謝您,祝您有個愉快的一天!

+0

沒有人會幫助你,如果你不解釋你試過 – Alburkerk

回答

1

以下是精美名稱而不是名稱的功能。你可以自己過濾數組。

function searchCompanies(text) { 
     var nameand = [], 
      namesNot = []; 
     text = text.replace(/\s\s+/g, ' '); //remove multiple whitespace 
     var words = text.split(' '); 
     for (var i = 0; i < words.length; i++) { 
      var word = words[i].toLowerCase(); 
      if (i == 0) 
       text.push(words[i]); 
      else if (word != 'and' && word != 'not') { 
       if (words[i - 1].toLowerCase() != 'not') 
        text.push(words[i]); 
       else 
        namesNot.push(words[i]); 
      } 
     } 
    } 
+0

瞭解。謝謝。我認爲它有一些庫。再次感謝 – Serhiy

0

你想解析文本並基於它運行代碼。這可能會變得棘手,所以我們的目標是儘可能簡化系統的規則。

在這種情況下,一個問題是我們需要區分名稱與andnot等關鍵字。我們可以維護一個列表,如const keywords = ['and', 'not'],並將任何不在該列表中的名稱作爲名稱。如何區分大小寫? And應該被視爲一個名稱,因爲它是大寫?大寫字母是區分名字和非名字的便捷方式。

這只是冰山一角。

但是沒關係,讓我們假設問題和陳述一樣簡單。我們只是想達到最低限度的目標。我會假設所有名字都應該包含在內,並且not是唯一真正有意義的關鍵字。我將排除前面有not的所有名稱。

// Extremely naive, not suitable for production. Will get 
// tricked by whitespace and other simple things. 
const isName = (str) => { 
    return str[0] === str[0].toUpperCase(); 
}; 

const input = document.querySelector('input[type="text"]'); 
input.addEventListener('change', (evt) => { 
    const tokens = evt.target.value.split(' '); 
    const names = tokens.filter((name, i, arr) => { 
     return isName(name) && arr[i - 1] !== 'not'; 
    }); 
    const company = { 
     members : names.map((name) => { 
      return { name }; 
     }) 
    }; 
}); 
相關問題