Learn Functional Programming by Building a Spreadsheet - Step 25

Tell us what’s happening:

I have a problem with the function const median = nums => {}.

I can’t seem to find out what is wrong. Inside that function, in the return, the “falsy” bit of the ternary operator does not pass the test. I’ve tried so many different combinations and can’t find out what is wrong with it and what is the correct answer.

The hint provided is:

If the ternary is false, you should return the value of sorted at the middle index. Use Math.ceil() to round the middle value up.

I’ve really tried about 6-8 different combinations and don’t know what the answer is. The explanations are quite confusing…

Your code so far

<!-- file: index.html -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link rel="stylesheet" href="./styles.css" />
    <title>Functional Programming Spreadsheet</title>
  </head>
  <body>
    <div id="container">
      <div></div>
    </div>
    <script src="./script.js"></script>
  </body>
</html>
/* file: styles.css */
#container {
  display: grid;
  grid-template-columns: 50px repeat(10, 200px);
  grid-template-rows: repeat(11, 30px);
}

.label {
  background-color: lightgray;
  text-align: center;
  vertical-align: middle;
  line-height: 30px;
}
/* file: script.js */
const isEven = num => num % 2 === 0;
const sum = nums => nums.reduce((acc, el) => acc + el, 0);
const average = nums => sum(nums) / nums.length;


// User Editable Region

const median = nums => {
  const sorted = nums.slice().sort((a, b) => a - b);
  const length = sorted.length;
  const middle = length / 2 - 1;
  return isEven(length) ? average([sorted[middle], sorted[middle + 1]]) / 2 : sorted[Math.ceil(middle)];
}

// User Editable Region


const range = (start, end) => Array(end - start + 1).fill(start).map((element, index) => element + index);
const charRange = (start, end) => range(start.charCodeAt(0), end.charCodeAt(0)).map(code => String.fromCharCode(code));

window.onload = () => {
  const container = document.getElementById("container");
  const createLabel = (name) => {
    const label = document.createElement("div");
    label.className = "label";
    label.textContent = name;
    container.appendChild(label);
  }
  const letters = charRange("A", "J");
  letters.forEach(createLabel);
  range(1, 99).forEach(number => {
    createLabel(number);
    letters.forEach(letter => {
      const input = document.createElement("input");
      input.type = "text";
      input.id = letter + number;
      input.ariaLabel = letter + number;
      container.appendChild(input);
    })
  })
}

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36

Challenge Information:

Learn Functional Programming by Building a Spreadsheet - Step 25

1 Like

You’re super close

You don’t need the divide by two here

reason being is because your average function is already adding up all of the numbers and dividing it by the length.
So you don’t need any division in your answer

hope that helps

1 Like

Oh I didn’t see that. That was the answer! Great! Thanks so much! Took me ages and I was focused on something else :heart:

1 Like

Reviving this post… heres my code :slight_smile:

const median = nums => {
const sorted = nums.slice().sort((a, b) => a - b);
const length = sorted.length;
const middle = length / 2 - 1;
return isEven(length)
? average([sorted[middle], sorted[middle + 1]])
: Math.ceil(sorted[middle]);
}

console still yelling at me to return Math.ceil(sorted[middle]) if false.

please open your own topic to ask for help, do not revive old posts