Loading ...
Sorry, an error occurred while loading the content.

Re: Array.prototype.reduce

Expand Messages
  • douglascrockford
    ... function array_to_object(array) { var result = {}; array.forEach(function (key) { result[key] = true; }); return result; }
    Message 1 of 5 , Nov 26, 2012
    • 0 Attachment
      --- In jslint_com@yahoogroups.com, "rodobrist" <roderickobrist@...> wrote:
      >
      >
      >
      > --- In jslint_com@yahoogroups.com, "douglascrockford" <douglas@> wrote:
      > >
      > > --- In jslint_com@yahoogroups.com, "rodobrist" <roderickobrist@> wrote:
      > > >
      > > > Hi guys,
      > > >
      > > > I was coding and I noticed that I often make the same error from using reduce.
      > > >
      > > > e.g.
      > > >
      > > > var options = ['nocaps', 'evil', 'node', 'browser'],
      > > > optionsAsObject = options.reduce(function (options, item) {
      > > > options[item] = true;
      > > > }, {});
      > > >
      > > > // When it should be:
      > > > var options = ['nocaps', 'evil', 'node', 'browser'],
      > > > optionsAsObject = options.reduce(function (options, item) {
      > > > options[item] = true;
      > > > return options;
      > > > }, {});
      > > >
      > > > Functions have a default/implied return value of undefined, this means if the array has more than one item this will throw an error.
      > > >
      > > > I'm suggesting that if the reduce method is invoked with a non primative second argument and function's first argument has an assignment to its property, there must be an explicit return value.
      > > >
      > > > e.g.
      > > >
      > > > options.reduce(function (options, item) {
      > > > // first argument is modified
      > > > options[item] = true;
      > > >
      > > > // Missing return value
      > > > }, {}); // reduce is invoked with non primative second argument
      > >
      > >
      > > I think the error may be that you are using the wrong method: reduce when you should forEach. I am not sure how to test for that.
      > >
      >
      > No, I know when to use each method.
      >
      > Ill try to give another example, the JSLint source uses a method named
      > array_to_object, which can be re-written like this:
      >
      > function array_to_object(array, value) {
      > return array.reduce(function (object, key) {
      > object[key] = value;
      > return object; //I forget this line allot
      > }, {});
      > }
      >
      > I suspect that the reduce method is used like this commonly, and I often forget to type the "return object;" statement.
      >
      > This is why the function passed into array.reduce should have an
      > explicit return value.


      function array_to_object(array) {
      var result = {};
      array.forEach(function (key) {
      result[key] = true;
      });
      return result;
      }
    • rodobrist
      ... Ok, thanks Doug. I suppose that construct is less prone to errors.
      Message 2 of 5 , Nov 26, 2012
      • 0 Attachment
        --- In jslint_com@yahoogroups.com, "douglascrockford" <douglas@...> wrote:
        >
        >
        >
        > --- In jslint_com@yahoogroups.com, "rodobrist" <roderickobrist@> wrote:
        > >
        > >
        > >
        > > --- In jslint_com@yahoogroups.com, "douglascrockford" <douglas@> wrote:
        > > >
        > > > --- In jslint_com@yahoogroups.com, "rodobrist" <roderickobrist@> wrote:
        > > > >
        > > > > Hi guys,
        > > > >
        > > > > I was coding and I noticed that I often make the same error from using reduce.
        > > > >
        > > > > e.g.
        > > > >
        > > > > var options = ['nocaps', 'evil', 'node', 'browser'],
        > > > > optionsAsObject = options.reduce(function (options, item) {
        > > > > options[item] = true;
        > > > > }, {});
        > > > >
        > > > > // When it should be:
        > > > > var options = ['nocaps', 'evil', 'node', 'browser'],
        > > > > optionsAsObject = options.reduce(function (options, item) {
        > > > > options[item] = true;
        > > > > return options;
        > > > > }, {});
        > > > >
        > > > > Functions have a default/implied return value of undefined, this means if the array has more than one item this will throw an error.
        > > > >
        > > > > I'm suggesting that if the reduce method is invoked with a non primative second argument and function's first argument has an assignment to its property, there must be an explicit return value.
        > > > >
        > > > > e.g.
        > > > >
        > > > > options.reduce(function (options, item) {
        > > > > // first argument is modified
        > > > > options[item] = true;
        > > > >
        > > > > // Missing return value
        > > > > }, {}); // reduce is invoked with non primative second argument
        > > >
        > > >
        > > > I think the error may be that you are using the wrong method: reduce when you should forEach. I am not sure how to test for that.
        > > >
        > >
        > > No, I know when to use each method.
        > >
        > > Ill try to give another example, the JSLint source uses a method named
        > > array_to_object, which can be re-written like this:
        > >
        > > function array_to_object(array, value) {
        > > return array.reduce(function (object, key) {
        > > object[key] = value;
        > > return object; //I forget this line allot
        > > }, {});
        > > }
        > >
        > > I suspect that the reduce method is used like this commonly, and I often forget to type the "return object;" statement.
        > >
        > > This is why the function passed into array.reduce should have an
        > > explicit return value.
        >
        >
        > function array_to_object(array) {
        > var result = {};
        > array.forEach(function (key) {
        > result[key] = true;
        > });
        > return result;
        > }
        >

        Ok, thanks Doug. I suppose that construct is less prone to errors.
      Your message has been successfully submitted and would be delivered to recipients shortly.