2016-08-24 84 views
0

由於我工作中的一些框架限制,我一直試圖將我的代碼從es6轉換爲es5 ......雖然我一直在努力找出問題所在。由於某些原因,代碼工作不完全相同,也沒有錯誤...es5破解es5中的代碼

有人可以告訴我如果我已經正確翻譯?

這是ES6代碼:

function filterFunction(items, filters, stringFields = ['Title', 'Description'], angular = false) { 
    // Filter by the keys of the filters parameter 
    const filterKeys = Object.keys(filters); 

    // Set up a mutable filtered object with items 
    let filtered; 

    // Angular doesn't like deep clones... *sigh* 
    if (angular) { 
     filtered = items; 
    } else { 
     filtered = _.cloneDeep(items); 
    } 

    // For each key in the supplied filters 
    for (let key of filterKeys) { 
     if (key !== 'TextInput') { 
      filtered = filtered.filter(item => { 

       // Make sure we have something to filter by... 
       if (filters[key].length !== 0) { 
        return _.intersection(filters[key], item[key]).length >= 1; 
       } 

       return true; 
      }); 
     } 

     // If we're at TextInput, handle things differently 
     else if (key === 'TextInput') { 
      filtered = filtered.filter(item => { 
       let searchString = ""; 

       // For each field specified in the strings array, build a string to search through 
       for (let field of stringFields) { 
        // Handle arrays differently 
        if (!Array.isArray(item[field])) { 
         searchString += `${item[field]} `.toLowerCase(); 
        } else { 
         searchString += item[field].join(' ').toLowerCase(); 
        } 
       } 

       // Return the item if the string matches our input 
       return searchString.indexOf(filters[key].toLowerCase()) !== -1; 
      }); 
     } 
    } 
    return filtered; 
} 

這是我翻譯的那部分99%的工作代碼..

function filterFunction(items, filters, stringFields, angular) { 
    // Filter by the keys of the filters parameter 
    var filterKeys = Object.keys(filters); 

    // Set up a mutable filtered object with items 
    var filtered; 

    // Angular doesn't like deep clones... *sigh* 
    if (angular) { 
     filtered = items; 
    } else { 
     filtered = _.cloneDeep(items); 
    } 

    // For each key in the supplied filters 
    for (var key = 0 ; key < filterKeys.length ; key ++) { 

     if (filterKeys[key] !== 'TextInput') { 
      filtered = filtered.filter(function(item) { 

       // Make sure we have something to filter by... 
       if (filters[filterKeys[key]].length !== 0) { 
        return _.intersection(filters[filterKeys[key]], item[filterKeys[key]]).length >= 1; 
       } 

       return true; 
      }); 
     } 

     // If we're at TextInput, handle things differently 
     else if (filterKeys[key] === 'TextInput') { 
      filtered = filtered.filter(function(item) { 
       var searchString = ""; 

       // For each field specified in the strings array, build a string to search through 
       for (var field = 0; field < stringFields.length; field ++) { 
        // Handle arrays differently 
        console.log(field); 
        if (!Array.isArray(item[stringFields[field]])) { 
         searchString += item[stringFields[field]] + ' '.toLowerCase(); 
        } else { 
         searchString += item[stringFields[field]].join(' ').toLowerCase(); 
        } 
       } 

       // Return the item if the string matches our input 
       return searchString.indexOf(filters[filterKeys[key]].toLowerCase()) !== -1; 
      }); 
     } 
    } 
    return filtered; 
} 
+1

爲什麼不你只用[babeljs](https://babeljs.io/)它會照顧ES版本。 –

+1

什麼似乎沒有工作完全一樣? – Karin

+0

其他如果與'TextInput'的陳述,我有一種感覺,它沒有被正確翻譯.. – Kiwimoisi

回答

5

這兩條線

​​

是不等價的確實。要應用toLowerCase方法對字符串的所有部分,你需要包裹ES5串聯括號:

searchString += (item[stringFields[field]] + ' ').toLowerCase(); 

,或者作爲空白無法反正小寫,只需使用

searchString += item[stringFields[field]].toLowerCase() + ' '; 
+0

絕對的傳說謝謝你的隊友 – Kiwimoisi

0

這裏是babeljs本身就是一個轉換的代碼,如上評論。

'use strict'; 

function filterFunction(items, filters) { 
    var stringFields = arguments.length <= 2 || arguments[2] === undefined ? ['Title', 'Description'] : arguments[2]; 
    var angular = arguments.length <= 3 || arguments[3] === undefined ? false : arguments[3]; 

    // Filter by the keys of the filters parameter 
    var filterKeys = Object.keys(filters); 

    // Set up a mutable filtered object with items 
    var filtered = void 0; 

    // Angular doesn't like deep clones... *sigh* 
    if (angular) { 
     filtered = items; 
    } else { 
     filtered = _.cloneDeep(items); 
    } 

    // For each key in the supplied filters 
    var _iteratorNormalCompletion = true; 
    var _didIteratorError = false; 
    var _iteratorError = undefined; 

    try { 
     var _loop = function _loop() { 
      var key = _step.value; 

      if (key !== 'TextInput') { 
       filtered = filtered.filter(function (item) { 

        // Make sure we have something to filter by... 
        if (filters[key].length !== 0) { 
         return _.intersection(filters[key], item[key]).length >= 1; 
        } 

        return true; 
       }); 
      } 

      // If we're at TextInput, handle things differently 
      else if (key === 'TextInput') { 
        filtered = filtered.filter(function (item) { 
         var searchString = ""; 

         // For each field specified in the strings array, build a string to search through 
         var _iteratorNormalCompletion2 = true; 
         var _didIteratorError2 = false; 
         var _iteratorError2 = undefined; 

         try { 
          for (var _iterator2 = stringFields[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { 
           var field = _step2.value; 

           // Handle arrays differently 
           if (!Array.isArray(item[field])) { 
            searchString += (item[field] + ' ').toLowerCase(); 
           } else { 
            searchString += item[field].join(' ').toLowerCase(); 
           } 
          } 

          // Return the item if the string matches our input 
         } catch (err) { 
          _didIteratorError2 = true; 
          _iteratorError2 = err; 
         } finally { 
          try { 
           if (!_iteratorNormalCompletion2 && _iterator2.return) { 
            _iterator2.return(); 
           } 
          } finally { 
           if (_didIteratorError2) { 
            throw _iteratorError2; 
           } 
          } 
         } 

         return searchString.indexOf(filters[key].toLowerCase()) !== -1; 
        }); 
       } 
     }; 

     for (var _iterator = filterKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { 
      _loop(); 
     } 
    } catch (err) { 
     _didIteratorError = true; 
     _iteratorError = err; 
    } finally { 
     try { 
      if (!_iteratorNormalCompletion && _iterator.return) { 
       _iterator.return(); 
      } 
     } finally { 
      if (_didIteratorError) { 
       throw _iteratorError; 
      } 
     } 
    } 

    return filtered; 
} 

附:或者有更好的方式直接使用babeljs而不用手動轉換它。

+0

我已經看到了,這使得它也工作,雖然它是非常醜陋的,將更難調試.. – Kiwimoisi

+0

@Kiwimoisi巴貝爾還提供了[調試工具](https://babeljs.io/docs/setup/#babel_node_debug),它也會創建源地圖。所以調試傳輸的代碼將非常簡單。 –