• 0 Posts
  • 11 Comments
Joined 2 years ago
cake
Cake day: June 15th, 2023

help-circle

  • Looking back on my career, submitting your first merge/pull request can take anywhere from a few hours to several weeks (we’re talking about 8+ hour work days). And that’s at companies that have an onboarding process and coworkers you can ask for help and explanations about the code base, architecture etc.

    Getting into someone else’s code (this may include your past self) is almost never easy and often feels convoluted, because it’s very difficult to see the context that existed at the time when the code was written. And by context I mean everything that influenced the decision to write lines the way they were written, including undocumented discussions, necessary but non-obvious workarounds, understanding of the problem and solution space by the dev, general state of mind of the person writing the code and more.

    Don’t beat yourself up because you couldn’t contribute in just a few hours.

    I would first reach out to the devs on IRC/Discord/Matrix and express interest to contribute and see how they react. You don’t know if they would even accept your PR, so I wouldn’t do too much work upfront.

    Then, when they are open to work with you, find out if they are willing to help you ease into the code. What files should you study to implement the changes that you’ve discussed earlier, any considerations that are not obvious, is there legacy code that you shouldn’t touch etc.

    It’s important to keep in mind that (collaborative) software development is more than just being able to write code. And a lot of the surrounding work is not very glamorous or fun.

    I hope that helps and wish you good luck! 🤞









  • I think I misunderstood your initial post (and definitely didn’t read it as carefully as I should have 😅).

    Do I understand your correctly that your goal is a companion object for your arrays that simplifies access? Not a new data structure that you’d user instead of arrays? If so, most of my points are moot.

    If your IDs are integers then there is no need for an hybrid at all, precisely because all you have to do is put each item at the same position as their ID.

    If you don’t treat IDs as opaque values, this is true.

    I’ll definitely run benchmarks so that users would be aware of performance losses, if any. But use cases of hybrid arrays are mostly small datasets so it usually shouldn’t be a concern indeed.

    I think my point is actually wrong (it was really late when I was writing my initial response). Performance would be O(n), since that’s the worst case scenario.

    Anyways, I hope you could take something useful from my answer.

    Happy hacking :D


  • I’m pretty sure I’ve been in your situation but haven’t created a dictionary/array hybrid.

    Without any more details about your use case and situation, I can imagine a few pitfalls with your solution:

    • Serialization might not behave as you would expect (JSON.stringify).
    • 3rd-party functions might not be able to deal with your data structure properly (again, potentially unexpected behavior).
    • You can’t easily access array methods (find, filter, map etc).
    • How do you distinguish between ID access and index access? ArrayLike([ {id: "1" }, { id: "2" } ])[1] returns { id: "2" }, how do you access { id: "1" } by ID?
    • It’s harder to reason about access time of lookups. However, this might not be a concern of yours.
    • It may cause confusion if you’re working with other developers.

    That being said, unless you work in an environment where your code should be easily understandable by others, the best way to find out if this is a good idea or not, is to try :)

    Me personally, I usually use an associateBy function, when I need a values-by-ID structure. Of course this is not as convenient to use as your approach, but it’s good enough for me.

    // this WILL drop elements if key is not unique 
    function associateBy(array, key) {
      return array.reduce((acc, el) => ({
        ...acc,
        [el[key]]: el
      }), {});
    }
    
    associateBy([
      {id: "foo"},
      {id: "bar"}
    ], "id").foo; // -> {id: "foo"}
    

    Good luck!