2016-08-24 15 views
0

私のコードをes6からes5に翻訳しようとしましたが、私の仕事でいくつかのフレームワークの制限があるためです...問題は何かを見つけるのにかなり苦労しました。何らかの理由でコードがまったく同じように動作せず、エラーもありません。es6のコードが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」のelse文の場合、正しく翻訳されていないと感じています。 – Kiwimoisi

答えて

5

この2行

​​

は確かに同じではありません。文字列のすべての部分に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; 
} 

P.S.または手動で変換せずに直接babeljsを使用するより良い方法があります。

+0

私はそれを見て、それもうまくいきますが、非常に醜いですし、デバッグするのがずっと難しくなります。 – Kiwimoisi

+0

@Kiwimoisi babel [デバッグツール](https://babeljs.io/docs/setup/#babel_node_debug)も用意されており、ソースマップも作成されます。したがって、翻訳されたコードのデバッグは非常に簡単です。 –

関連する問題