否定回调函数返回值

时间:2016-05-23 20:05:59

标签: javascript arrays filter

直截了当的问题:

我可以否定一个返回truefalse一个array.filter()语句的回调函数吗? e.g。

//the callback function
function isEven(element, index, array){
    if (index%2 == 0 || index == 0){
        return true;
    }
    return false;
}

//what i want to do with that function
//arr[i] is a string
var evens = arr[i].split("").filter(isEven); //works
var odds = arr[i].split("").filter(!isEven); // doesn't work

上面一行给出了错误TypeError: false is not a function

有一些背景问题:

我正在接受一些Hackerrank挑战,并且我遇到了需要接受字符串并处理它的练习,因此输出为:具有偶数索引值的字符构成一个新字符串并且奇数索引位置的字符构成另一个字符串,0表示为偶数。

输入

airplane

输出

evens = 'arln'

odds = 'ipae'

我已经通过循环遍历字符串,评估索引然后将值推送到对应的新数组(我后来转换为字符串)来解决它,但是我发现我可以在更多功能方式,使用Array.prototype.filter()函数。

现在我创建一个新函数来评估索引号是否均匀,我想使用相同的函数来填充两个数组(均衡和赔率),就像这样(现在你可以参考直截了当的问题部分):

var evens = arr[i].split("").filter(isEven); //works
var odds = arr[i].split("").filter(!isEven); // doesn't work

3 个答案:

答案 0 :(得分:2)

执行此操作的最简单方法是仅传递一个匿名函数,该函数返回isEven的否定结果。

var evens = arr[i].split("").filter(function(el, index, array) {
  return !isEven(el, index, array);
});

但是你可以更进一步,编写一个not函数,它基本上为你生成匿名函数。这是一个这样的功能的例子。



var input = [0, 1, 2, 3, 4, 5];
function isEven(value) {
  return value % 2 === 0;
}
function not(f) {
  return function() {
    return !f.apply(null, arguments);
  }
}

var output = input.filter(not(isEven));
console.log(output);




如果您处于支持rest parameters的环境中,那么您可以像这样编写not函数。



var input = [0, 1, 2, 3, 4, 5];
function isEven(value) {
  return value % 2 === 0;
}
function not(f) {
  return function(...args) {
    return !f.apply(null, args);
  }
}

var output = input.filter(not(isEven));
console.log(output);




答案 1 :(得分:1)

你需要传入一个匿名函数,然后在那里否定isEven

var odds = arr[i].split("").filter(function(a, index, array) {
  return !isEven(a, index, array);
});

简单示例:

Working Example

function isEven(n) {
  return n % 2 === 0;
}

var arr = [0,1,2,3,4,5,6,7,8,9];

var a = arr.filter(isEven);

var b = arr.filter(function(a) {
  return !isEven(a);
});

答案 2 :(得分:0)

我使用的解决方案是这样的:

'click .merge-icon': (e) => {
    var programId = Router.current().url.split('/').pop();
    var programObj = Programs.findOne(programId);
    var insertedDocuments = [];
    var i = 0;
    var count = programObj.activityIds.count;
    var fileDownloadPromise = new Promise((resolve, reject) => {
      programObj.activityIds.forEach(function(activityId) {
        var activityObj = Activities.findOne(activityId);
        var documentObj = ActivityFiles.findOne(activityObj.documents.pop()._id);
        JSZipUtils.getBinaryContent(documentObj.url(), callback);
        function callback(error, content) {
          var zip = new JSZip(content);
          var doc = new Docxtemplater().loadZip(zip);
          var xml = zip.files[doc.fileTypeConfig.textPath].asText();
          xml = xml.substring(xml.indexOf("<w:body>") + 8);
          xml = xml.substring(0, xml.indexOf("</w:body>"));
          xml = xml.substring(0, xml.indexOf("<w:sectPr"));
          insertedDocuments.push(xml);
          i++;
          if (i == count - 1) {
            resolve();
          }
        }
      });
    });
    fileDownloadPromise.then(() => {
      JSZipUtils.getBinaryContent('/assets/template.docx', callback);
      function callback(error, content) {
        console.log(content);
        var zip = new JSZip(content);
        var doc = new Docxtemplater().loadZip(zip);
        setData(doc);
      }

      function setData(doc) {
        doc.setData({
          body: insertedDocuments.join('<w:br/><w:br/>')
        });
        doc.render();
        useResult(doc);
      }

      function useResult(doc) {
        var out = doc.getZip().generate({
          type: 'blob',
          mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
        });
        saveAs(out, programObj.name + '.docx');
      }
    });
  }