rest

Perils of Perestroika : viewpoints from the Soviet press, 1989-1991 / edited by Isaac J. Tarasulo.

Wilmington, Del. : SR Books, 1992




rest

Computer ethics : cautionary tales and ethical dilemmas in computing / Tom Forester and Perry Morrison

Forester, Tom




rest

Design of concrete bridge beams prestressed with CFRP systems / Abdeldjelil Belardi, Mina Dawood, Prakash Poudel [and five others]

Barker Library - TE7.N275 no.907




rest

2nd ODI: Interesting stats from the humdinger in Pallekele

Statistical highlights of the second ODI between India and Sri Lanka in Pallekele.




rest

Lionel Messi and his Barcelona teammates return to training as La Liga eyes restart

The players arrived alone for individual sessions and took to the three pitches without passing through the changing rooms.




rest

Covid-19: Karnataka allows restaurants, pubs, bars to sell liquor but only as takeaway

The establishments will be allowed to sell liquor from 9 am to 7 pm.




rest

NBA’s restart plan amidst coronavirus includes daily testing of players, limited locations: Reports

NBA Commissioner Adam Silver explained the plan in a conference call open to all NBA players.




rest

Former Chhattisgarh CM Ajit Jogi suffers cardiac arrest, hospitalised

He has been put on ventilator support.




rest

Coronavirus: Tamil Nadu to ease lockdown restrictions in non-containment areas from Monday

The state has registered a huge increase in the number of coronavirus cases in the last few days.




rest

Services in family forestry Teppo Hujala, Anne Toppinen, Brett J. Butler, editors

Online Resource




rest

Grinnell: America's environmental pioneer and his restless drive to save the West / John Taliaferro

Dewey Library - QH31.G74 T35 2019




rest

Sustainable development goals: their impacts on forests and people / edited by Pia Katila, Carol J. Pierce Colfer, Wil de Jong, Glenn Galloway, Pablo Pacheco, Georg Winkel

Online Resource




rest

Statistical methods and applications in forestry and environmental sciences Girish Chandra, Raman Nautiyal, Hukum Chandra, editors

Online Resource




rest

Ecology, conservation, and restoration of Chilika Lagoon, India C. Max Finlayson, Gurdeep Rastogi, Deepak R. Mishra, Ajit K. Pattnaik, editors

Online Resource




rest

Forests and sustainable cities: inspiring stories from around the world.

Rotch Library - SD131.F677 2018




rest

Forest pest and disease management in Latin America: modern perspectives in natural forests and exotic plantations / Sergio A. Estay, editor

Online Resource




rest

Białowieża Primeval Forest: nature and culture in the Nineteenth Century / Tomasz Samojilik, Anastasia Fedotova, Piotr Daszkiewicz, Ian D. Rotherham

Online Resource




rest

Five Interesting Ways to Use Array.reduce() (And One Boring Way)

Chris Ferdinandi turns the heat down low and lets the sauce reduce while we take a look at how to add spice to our source with a sprinkling of Array.reduce(). Just a little ingenuity with the humblest of functions.


Of all the modern array methods, the one I had the hardest time wrapping my head around was Array.reduce().

On the surface, it seems like a simple, boring method that doesn’t do much. But below its humble exterior, Array.reduce() is actually a powerful, flexible addition to your developer toolkit.

Today, we’re going to look at some cool things you can do with Array.reduce().

How Array.reduce() works

Most of the modern array methods return a new array. The Array.reduce() method is a bit more flexible. It can return anything. Its purpose is to take an array and condense its content into a single value.

That value can be a number, a string, or even an object or new array. That’s the part that’s always tripped me up – I didn’t realize just how flexible it is!

The syntax

The Array.reduce() accepts two arguments: a callback method to run against each item in the array, and a starting value.

The callback also accepts two arguments: the accumulator, which is the current combined value, and the current item in the loop. Whatever you return is used as the accumulator for the next item in the loop. On the very first loop, that starting value is used instead.

var myNewArray = [].reduce(function (accumulator, current) {
  return accumulator;
}, starting);

Let’s look at some examples to make this all tangible.

1. Adding numbers together

Let’s say you had an array of numbers that you wanted to add together. Using Array.forEach(), you might do something like this:

var total = 0;

[1, 2, 3].forEach(function (num) {
  total += num;
});

This is the cliche example for using Array.reduce(). I find the word accumulator confusing, so in this example, I’m calling it sum, because that’s what it is.

var total = [1, 2, 3].reduce(function (sum, current) {
  return sum + current;
}, 0);

Here, we pass in 0 as our starting value.

In the callback, we add the current value to the sum, which has our starting value of 0 on the first loop, then 1 (the starting value of 0 plus the item value of 1), then 3 (the sum value of 1 plus the item value of 2), and so on.

Here’s a demo.

2. Combining multiple array methods into Array.map() and Array.filter() into a single step

Imagine you had an array of wizards at Hogwarts.

var wizards = [
  {
    name: 'Harry Potter',
    house: 'Gryfindor'
  },
  {
    name: 'Cedric Diggory',
    house: 'Hufflepuff'
  },
  {
    name: 'Tonks',
    house: 'Hufflepuff'
  },
  {
    name: 'Ronald Weasley',
    house: 'Gryfindor'
  },
  {
    name: 'Hermione Granger',
    house: 'Gryfindor'
  }
];

You want to create a new array that contains just the names of wizards who are in Hufflepuff. One way you could do that is by using the Array.filter() method to get back just wizards whose house property is Hufflepuff. Then, you’d use the Array.map() method to create a new array containing just the name property for the remaining wizards.

// Get the names of the wizards in Hufflepuff
var hufflepuff = wizards.filter(function (wizard) {
  return wizard.house === 'Hufflepuff';
}).map(function (wizard) {
  return wizard.name;
});

With the Array.reduce() method, we can get the same array in a single pass, improving our performance. You pass in an empty array ([]) as the starting value. On each pass, you check to see if the wizard.house is Hufflepuff. If it is, you push it to the newArr (our accumulator in this example). If not, you do nothing.

Either way, you return the newArr to become the accumulator on the next pass.

// Get the names of the wizards in Hufflepuff
var hufflepuff = wizards.reduce(function (newArr, wizard) {
  if (wizard.house === 'Hufflepuff') {
    newArr.push(wizard.name);
  }
  return newArr;
}, []);

Here’s another demo.

3. Creating markup from an array

What if, instead of creating an array of names, we wanted to create an unordered list of wizards in Hufflepuff? Instead of passing an empty array into Array.reduce() as our starting value, we’ll pass in an empty string ('') and call it html.

If the wizard.house equals Hufflepuff, we’ll concatenate our html string with the wizard.name wrapped in an opening and closing list item (li). Then, we’ll return the html to become the accumulator on the next loop.

// Create a list of wizards in Hufflepuff
var hufflepuffList = wizards.reduce(function (html, wizard) {
  if (wizard.house === 'Hufflepuff') {
    html += '<li>' + wizard.name + '</li>';
  }
  return html;
}, '');

Add an opening and closing unordered list element before and after Array.reduce(), and you’re ready to inject your markup string into the DOM.

// Create a list of wizards in Hufflepuff
var hufflepuffList = '<ul>' + wizards.reduce(function (html, wizard) {
  if (wizard.house === 'Hufflepuff') {
    html += '<li>' + wizard.name + '</li>';
  }
  return html;
}, '') + '</ul>';

See it in action here.

4. Grouping similar items in an array together

The lodash library has a groupBy() method takes a collection of items as an array and groups them together into an object based on some criteria.

Let’s say you want an array of numbers.

If you wanted to group all of the items in numbers together based on their integer value, you would do this with lodash.

var numbers = [6.1, 4.2, 6.3];

// returns {'4': [4.2], '6': [6.1, 6.3]}
_.groupBy(numbers, Math.floor);

If you had an array of words, and you wanted to group the items in words by their length, you would do this.

var words = ['one', 'two', 'three'];

// returns {'3': ['one', 'two'], '5': ['three']}
_.groupBy(words, 'length');

Creating a groupBy() function with Array.reduce()

You can recreate that same functionality using the Array.reduce() method.

We’ll create a helper function, groupBy(), that accepts the array and criteria to sort by as arguments. Inside groupBy(), we’ll run Array.reduce() on our array, passing in an empty object ({}) as our starting point, and return the result.

var groupBy = function (arr, criteria) {
  return arr.reduce(function (obj, item) {
    // Some code will go here...
  }, {});
};

Inside the Array.reduce() callback function, we’ll check to see if the criteria is a function, or a property of the item. Then we’ll get its value from the current item.

If there’s no property in the obj with that value yet, we’ll create it and assign an empty array as its value. Finally, we’ll push the item to that key, and return the object as the accumulator for the next loop.

var groupBy = function (arr, criteria) {
  return arr.reduce(function (obj, item) {

    // Check if the criteria is a function to run on the item or a property of it
    var key = typeof criteria === 'function' ? criteria(item) : item[criteria];

    // If the key doesn't exist yet, create it
    if (!obj.hasOwnProperty(key)) {
      obj[key] = [];
    }

    // Push the value to the object
    obj[key].push(item);

    // Return the object to the next item in the loop
    return obj;

  }, {});
};

Here’s a demo of the completed helper function.

Special thanks to Tom Bremer for helping me make some improvements to this one. You can find this helper function and more like it on the Vanilla JS Toolkit.

5. Combining data from two sources into an array

Remember our array of wizards?

var wizards = [
  {
    name: 'Harry Potter',
    house: 'Gryfindor'
  },
  {
    name: 'Cedric Diggory',
    house: 'Hufflepuff'
  },
  {
    name: 'Tonks',
    house: 'Hufflepuff'
  },
  {
    name: 'Ronald Weasley',
    house: 'Gryfindor'
  },
  {
    name: 'Hermione Granger',
    house: 'Gryfindor'
  }
];

What if you had another data set, an object of house points each wizard has earned.

var points = {
  HarryPotter: 500,
  CedricDiggory: 750,
  RonaldWeasley: 100,
  HermioneGranger: 1270
};

Imagine you wanted to combine both sets of data into a single array, with the number of points added to each wizard’s data in the wizards array. How would you do it?

The Array.reduce() method is perfect for this!

var wizardsWithPoints = wizards.reduce(function (arr, wizard) {

  // Get the key for the points object by removing spaces from the wizard's name
  var key = wizard.name.replace(' ', '');

  // If the wizard has points, add them
  // Otherwise, set them to 0
  if (points[key]) {
    wizard.points = points[key];
  } else {
    wizard.points = 0;
  }

  // Push the wizard object to the new array
  arr.push(wizard);

  // Return the array
  return arr;

}, []);

Here’s a demo combining data from two sources into an array.

6. Combining data from two sources into an object

What if you instead wanted to combine the two data sources into an object, where each wizard’s name was the key, and their house and points were properties? Again, the Array.reduce() method is perfect for this.

var wizardsAsAnObject = wizards.reduce(function (obj, wizard) {

  // Get the key for the points object by removing spaces from the wizard's name
  var key = wizard.name.replace(' ', '');

  // If the wizard has points, add them
  // Otherwise, set them to 0
  if (points[key]) {
    wizard.points = points[key];
  } else {
    wizard.points = 0;
  }

  // Remove the name property
  delete wizard.name;

  // Add wizard data to the new object
  obj[key] = wizard;

  // Return the array
  return obj;

}, {});

Here’s a demo combining two data sets into an object.

Should you use Array.reduce() more?

The Array.reduce() method has gone from being something I thought was pointless to my favorite JavaScript method. So, should you use it? And when?

The Array.reduce() method has fantastic browser support. It works in all modern browsers, and IE9 and above. It’s been supported in mobile browsers for a long time, too. If you need to go back even further than that, you can add a polyfill to push support back to IE6.

The biggest complaint you can make about Array.reduce() is that it’s confusing for people who have never encountered it before. Combining Array.filter() with Array.map() is slower to run and involves extra steps, but it’s easier to read. It’s obvious from the names of the methods what they’re supposed to be doing.

That said, there are times where Array.reduce() makes things that would be complicated more simple rather than more complicated. The groupBy() helper function is a good example.

Ultimately, this is another tool to add to your toolkit. A tool that, if used right, can give you super powers.


About the author

Chris Ferdinandi helps people learn vanilla JavaScript. He believes there’s a simpler, more resilient way to make things for the web.

Chris is the author of the Vanilla JS Pocket Guide series, creator of the Vanilla JS Academy training program, and host of the Vanilla JS Podcast. His developer tips newsletter is read by thousands of developers each weekday.

He’s taught developers at organizations like Chobani and the Boston Globe, and his JavaScript plugins have been used used by Apple and Harvard Business School. Chris Coyier, the founder of CSS-Tricks and CodePen, has described his writing as “infinitely quote-worthy.”

Chris loves pirates, puppies, and Pixar movies, and lives near horse farms in rural Massachusetts. He runs Go Make Things with Bailey Puppy, a lab-mix from Tennessee.

More articles by Chris




rest

The commander's dilemma: violence and restraint in wartime / Amelia Hoover Green

Dewey Library - JC328.6.H67 2018




rest

The myth of coequal branches: restoring the constitution's separation of functions / David J. Siemers

Dewey Library - JK305.S54 2018




rest

Shopian killings: Separatists leaders under house arrest, curfew on for ninth consecutive day

Curfew was first clamped in Shopian on September 8, following widespread clashes.




rest

Delhi ATM cash heist: Absconding cash van driver arrested, looted money recovered

Thirty-year old Satish and his cousin Shailender have been arrested from Etah in U.P.




rest

Odisha: Headmaster arrested for attempting to molest Class X girl

Arrest made after the villagers staged a demonstration demanding action against the headmaster.




rest

Meerut clash: Sangeet Som's brother arrested, wife booked

4 FIRs were registered in connection with damages to govt vehicles and vandalism during the clashes.




rest

Assam govt mulls salary hike for forest guards

Tarun Gogoi stressed on the need to modernise the weapons of the forest guards.




rest

Cyclone Phailin: Toll rises to 38; focus on relief, restoration

494 relief centres have been opened in Ganjam from today.




rest

Ahead of VHP's 'Sankalp Diwas' rally, 350 activists arrested

VHP's 'Sankalp Diwas' rally in Ayodhya has been banned by the state government.




rest

Students demand arrest of headmaster accused of molesting minor student

In lieu of a formal FIR against him, Pramod K Swain has been suspended but not arrested.




rest

Assam violence: Gogoi orders to arrest culprits, indefinite curfew clamped

Security tightened along border, curfew in force from 7 pm to 6 am within 2 km inside Assam.




rest

BJP protests against Omar govt; 70 cadres court arrest

BJP activists clashed with police on being stopped from marching towards the Civil Secretariat.




rest

IM, post-Patna: Terror outfit has signalled its ambitions even after Bhatkal's arrest

The bombs targeted Narendra Modi's rally in Patna in one of its highest-profile battlegrounds.




rest

Saradha scam: Suspended TMC MP Kunal Ghosh arrested

Ghosh, who was apprehending arrest since Friday, went to lodge a complaint against Arnab Ghosh.




rest

Haryana police arrest man for drugging, drowning wife and kids

He gave sweets laced with drugs before pushing all three into the canal: Police




rest

98 Lankan fishermen arrested by Coast Guard in last 13 days

Their three boats were seized under various sections of the Maritime Zones of India Act, 1981.




rest

Diplomat arrest case: US had sought Indian inquiry into maid's allegations

State Department spokesperson Marie Harf denied charges of not being in touch with Indian authorities.




rest

Diplomat arrest case: India softens stand, says it will find a solution with the US

Meanwhile, US has refused to apologise and drop visa fraud charges against Khobragade.




rest

Developments in language theory [electronic resource] : 9th international conference, DLT 2005, Palermo, Italy, July 4-8, 2005 : proceedings / Clelia De Felice, Antonio Restivo (eds.)

Berlin ; New York : Springer, [2005]




rest

Evaluating emergence, survival, and assembly of banksia woodland communities to achieve restoration objectives following topsoil transfer [electronic resource] / by Pawel Waryszak

Waryszak, Pawel, author




rest

Conservation of tropical rainforests : a review of financial and strategic solutions / Brian Joseph McFarland

McFarland, Brian Joseph, author




rest

Review of the implementation of the Regional Forest Agreement for the south-west forest region of Western Australia for the period 2009 - 2014 / Graham Wilkinson, independent reviewer

Wilkinson, Graham, author




rest

Global forest governance and climate change : interrogating representation, participation, and decentralization / Emmanuel O. Nuesiri, editor




rest

Industrial disasters and environmental policy : stories of villains, heroes, and the rest of us / Denise L. Scheberle

Scheberle, Denise, author




rest

Satellite remote sensing for conservation action : case studies from aquatic and terrestrial ecosystems / edited by Allison K. Leidner (ASRC Federal/National Aeronautics and Space Administration), Graeme M. Buchanan (RSPB, Edinburgh, UK)




rest

Microbes for restoration of degraded ecosystems / edited by D.J. Bagyaraj, Jamaluddin




rest

Climate change and terrestrial ecosystem modeling / Gordon Bonan (National Center for Atmospheric Research, Boulder, Colorado)

Bonan, Gordon B., author




rest

Plant conservation : the role of habitat restoration / Sergei Volis

Volis, Sergei, author




rest

Deed of variation in relation to the Regional Forest Agreement for the north east region / the Commonwealth of Australia, the State of New South Wales

Australia




rest

Deed of variation in relation to the Regional Forest Agreement for the southern region / the Commonwealth of Australia, the State of New South Wales

Australia, author




rest

Deed of variation in relation to the Regional Forest Agreement for the south-west forest region of Western Australia / the Commonwealth of Australia, the State of Western Australia

Australia, author, issuing body




rest

Let’s restore Darjeeling railway, Gowda writes to Mamata



  • DO NOT USE West Bengal
  • India