簡體   English   中英

如何將三元運算符應用於此代碼

[英]how to apply ternary operator to this code

function domainTypees(domains) {
    const domainType = [];

    for (let i = 0; i < domains.length; i++) {
        const domain = domains[i].split(".");
        console.log(domain);
        const lastdomain = domain[domain.length - 1];

        //1.5 creta the conditional statements
        /* return lastdomain==="org"?domainType.push("organization")
        :lastdomain==="com"?domainType.push("commercial")
        :lastdomain==="net"?domainType.push("network")
        :lastdomain==="info"?domainType.push("information")
        
        return domainType*/

        if (lastdomain === "org") {
            domainType.push("organization");
        } else if (lastdomain === "com") {
            domainType.push("commercial");
        } else if (lastdomain === "net") {
            domainType.push("network");
        } else if (lastdomain === "info") {
            domainType.push("information");
        }
    }
    return domainType;
}

console.log(domainTypees(["en.wiki.org", "codefights.com", "happy.net", "code.info"]));

我遇到的問題是當我嘗試應用三元運算符時,如果條件有效,但我無法以正確的方式應用三元運算符,有人可以告訴我如何去做。 提前致謝。

如果您刪除三元鏈前面的return並在最后添加一個回退,您的代碼將起作用,例如: 'unknown' (並確保return domainType保持在循環體之外)。 但正如評論中的人們已經提到的那樣,它會使代碼的可讀性和可維護性大大降低。

相反,您可以使用開關,如下所示:

switch (lastdomain) {
  case 'org':
    domainType.push('organization')
    break
  case 'com':
    domainType.push('commercial')
    break
  case 'net':
    domainType.push('network')
    break
  case 'info':
    domainType.push('information')
    break
}

...或者,對於最簡潔和最少重復的代碼,查找表:

const typeDescription = {
  org: 'organization',
  com: 'commercial',
  net: 'network',
  info: 'information'
}[lastdomain]

if (typeDescription) domainType.push(typeDescription)

這是您的代碼的字面翻譯,有點。 但是,更進一步,您似乎期望一個數組 output 與輸入的元素數量相同(否則,一旦您有一個不在列表中的 TLD,您就不會知道哪個是哪個,比如說.de )。 所以你需要一個默認值,例如unknown 在這種情況下, if將變得不必要:

domainType.push({
  org: 'organization',
  com: 'commercial',
  net: 'network',
  info: 'information'
}[lastdomain] || 'unknown')

但是,我們可以將您的整個 function 簡化如下:

function domainTypes (domains) {
  return domains.map(domain => ({
    org: 'organization',
    com: 'commercial',
    net: 'network',
    info: 'information'
  }[domain.split('.').pop()] || 'unknown'))
}

我確實同意在這種情況下三元語句不會提高可讀性的觀點。 就個人而言,我將 go 用於 CherryDT的答案中建議的字典方法,因為如果需要,添加更多擴展非常簡單。

如果您仍然想知道如何使用三元語句來完成,這取決於您在收到具有未知擴展名的域時希望在結果中包含什么。 在三元語句中,您總是需要最后的“else”部分。

  1. Map 對"unknown"的未知擴展:
function domainTypees(domains) {
  return domains.map((domain) => {
    const domainParts = domain.split(".");
    const domainExt = domainParts[domainParts.length - 1];
    return domainExt === "org"
      ? "organization"
      : domainExt === "com"
      ? "commercial"
      : domainExt === "net"
      ? "network"
      : domainExt === "info"
      ? "information"
      : "unknown";
  });
}

domainTypees(["en.wiki.org", "codefights.com", "happy.net", "code.info", "somewhere.eu"])
// results in: ["organization", "commercial", "network", "information", "unknown"]
  1. 使用flatMap過濾掉未知的擴展
function domainTypees(domains) {
  return domains.flatMap((domain) => {
    const domainParts = domain.split(".");
    const domainExt = domainParts[domainParts.length - 1];
    return domainExt === "org"
      ? ["organization"]
      : domainExt === "com"
      ? ["commercial"]
      : domainExt === "net"
      ? ["network"]
      : domainExt === "info"
      ? ["information"]
      : [];
  }, []);
}

domainTypees(["en.wiki.org", "codefights.com", "happy.net", "code.info", "somewhere.eu"]);
// results in: ["organization", "commercial", "network", "information"]

下面的代碼片段可以在不更改大部分原始代碼的情況下為您提供幫助。 玩得開心進行實驗

 function domainTypes(domains) { const domainType = [] for (let i = 0; i < domains.length; i++) { const domain = domains[i].split(".") console.log(domain) const lastdomain = domain[domain.length - 1] const type = lastdomain === "org"? "organization": lastdomain === "com"? "commercial": lastdomain === "net"? "network": lastdomain === "info"? "information": null if (type.== null) domainType.push(type) } return domainType } console.log( domainTypes([ "en.wiki,org". "codefights,com", "happy.net". "code,info". "other,xyz", ]) )

function domainType(array){
      let domainType;
      array.forEach(domain => {
             switch(domain.split(".")[1]){
                   case 'org':
                        domainType = 'organization';
                        break;
                   case 'com':
                        domainType = 'comminication';
                        break;
                   case 'net':
                        domainType = 'network';
                        break;
                   case 'info':
                        domainType = 'information';
                        break;
                   default:
                        domainType = 'unknown';
                        break;
              }
              return domainType;
       });
}

取而代之的是做一個 for,做一個forEach ,它更干凈,而不是使用一堆else if為每個域使用一個帶caseswitch (和一個default 。基本上是一個最終的else )並最終返回它。

暫無
暫無

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

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