Summarizing the score of a personality quiz
Let me review your code first and then provide an alternative:


The naming for the reduce-function is a little confusing, since you're just using x. Generally the lambda parameters are problematically named. Only fixing the naming should already give huge boosts to maintainability:

const res = _.zip(questions, answers)
    .filter(qa =&gt; qa[1])
    .map(qa =&gt; qa[0].quadrant)
    .reduce(
        (res, quadrant) =&gt; {
        [...]
    );



that was the simple part. Along the way we kind of made the comments in the code superfluous. I'll not review the assignment of the return quadrants though it seems like there could be some simplifications if you didn't try to directly return a hardcoded array.



Let's reexamine your approach. You already stated that you're basically trying to accumulate increments and decrements along two axes. Let's consider the following then:

.filter(qa =&gt; qa[1])
.map(qa =&gt; {
  switch (qa[0].quadrant) {
     case 1:
       return { dominance: 1, warmth: -1 };
     case 2:
       return { dominance: -1, warmth: -1 };
     case 3:
       return { dominance: -1, warmth: 1 };
     case 4:
       return { dominance: 1, warmth: 1 };
     default: 
       return { dominance: 0, warmth: 0 };
  }
}).reduce(
  (res, assessment) =&gt; {
    return { dominance: res.dominance + assessment.dominance,
             warmth: res.warmth + assessment.warmth }
  },
  { dominance: 0, warmth: 0 }
);


This clarifies your logic tremendously and makes obvious to the reader which quadrant entails which change in assessment