Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.javascript > #35220

Re: get set value in array of objects

From Thomas 'PointedEars' Lahn <PointedEars@web.de>
Newsgroups comp.lang.javascript
Subject Re: get set value in array of objects
Date 2018-06-13 05:18 +0200
Organization PointedEars Software (PES)
Message-ID <1609990.zEmimHbLjD@PointedEars.de> (permalink)
References <m7idnSrECaxLhYLGnZ2dnUU7-fvNnZ2d@westnet.com.au> <871sdchv1w.fsf@bsb.me.uk>

Show all headers | View raw


Ben Bacarisse wrote:

> Andrew Poulos <ap_prog@hotmail.com> writes:
>> And to set the 'name' value for the object with an id = 3 I'm using:
>>
>> var ind = objArray.findIndex(function(obj) {
>>   return obj.id === 3;
>> });
>>
>> objArray[ind]['name'] = "Fred";
>>
>> It works but I'm wondering if someone could show a "better" way.
> 
> You don't need the index since objects are shared by reference in
> ECMAScript

Only in the broadest possible sense.  There is no concept of “share by 
reference” in programming.  The wording probably stems from the idea that 
objects would be “call-by-reference” and other values would be “call-by-
value”, which is a common *misconception* about ECMAScript 
(implementations).  Instead, *all* values are “call-by-value”, but objects’ 
properties can only be accessed through references to objects; so those 
references are the passed values then.  (This is not exclusive to 
ECMAScript.)

Also, this logic is flawed.  One does not need the “id” as index *here* in 
this *particular* example, because the ”id” property value happens to be the 
index of the array element that is the reference to the respective Object 
instance *here*.

> If you do a great many look-ups, it might pay to make an "index" object.

I find that a strange way to name things.  An “index object” would be an 
object that holds information about one index instead, would it not?

> If the IDs are always small integers, this could be an array,

Whereas "small" is from 0 to 2³²−2 (= 4294967294), and “array” is “_Array 
instance_”:

<http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,
%201st%20edition,%20June%201997.pdf#page=65>
(1997)

through

<http://www.ecma-international.org/ecma-262/8.0/index.html#sec-array-exotic-objects>
(2017).

For Array-like objects with larger indexes, e.g. jsx.array.BigArray can be 
used:

<https://github.com/PointedEars/JSX/blob/master/array.js#L491-L1127>

> Essentially you build an array where idx[3] is a reference to the object
> with id === 3. 

A possibility:

  /* Use “= []” for an Array instance instead */
  let id2objMap = Object.create(null);

  objArray.forEach((el) => {this[el.id] = el}, id2objMap);

  /* true */
  id2objMap[3].id === 3

Corresponding to Array.from(), there should be an Object.from(objArray, …) 
for this:

  if (!(Object.from instanceof Function))
  {
    Object.from = ((iterable, mapping, thisArg) => {
      var result = thisArg || Object.create(null);

      if (typeof mapping == "undefined")
      {
        throw new TypeError("Mapping not specified");
      }

      let mapfn = mapping;
      if (!(mapping instanceof Function))
      {
        mapfn = function (el) { this[el[mapping]] = el; };
      }

      Array.from(iterable).forEach(mapfn, result);

      return result;
    });
  }

  let id2objMap = Object.from(objArray, "id");


BTW,

  mapfn = ((el) => { this[el[mapping]] = el; });

instead does _not_ work.  Because despite the callback being called with 
“result” as the “this” value, “this” in the arrow function will stubbornly 
refer to the global object in non-strict mode, and be “undefined” in strict 
mode.  This is the result of an IMHO bad design decision/oversight that 
unnecessarily severely limits the use-cases of the useful arrow function 
shorthand.

By contrast, the more backwards-compatible, but longer, function expression 
works in both modes there.

> (This post got delayed.  I finished it anyway, but I bet you've had all
> the answers you need already.)

It might have been better then if you had just not posted.  Consider that 
you do not have to save the world alone, especially if you are unsuited to 
do so.

-- 
PointedEars
FAQ: <http://PointedEars.de/faq> | <http://PointedEars.de/es-matrix>
<https://github.com/PointedEars> | <http://PointedEars.de/wsvn/>
Twitter: @PointedEars2 | Please do not cc me./Bitte keine Kopien per E-Mail.

Back to comp.lang.javascript | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

get set value in array of objects Andrew Poulos <ap_prog@hotmail.com> - 2018-06-12 10:50 +1000
  Re: get set value in array of objects "Evertjan." <exxjxw.hannivoort@inter.nl.net> - 2018-06-12 16:40 +0200
  Re: get set value in array of objects "Christoph M. Becker" <cmbecker69@arcor.de> - 2018-06-12 17:12 +0200
  Re: get set value in array of objects Cezary Tomczyk <cezary.tomczyk@gmail.com> - 2018-06-12 17:36 +0200
    using Map Was: Re: get set value in array of objects Andrew Poulos <ap_prog@hotmail.com> - 2018-06-13 13:56 +1000
      Re: using Map Was: Re: get set value in array of objects Andrew Poulos <ap_prog@hotmail.com> - 2018-06-13 14:43 +1000
        Re: using Map Was: Re: get set value in array of objects Andrew Poulos <ap_prog@hotmail.com> - 2018-06-13 17:17 +1000
          Re: using Map Was: Re: get set value in array of objects Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2018-06-13 23:32 +0200
      Re: using Map Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2018-06-13 18:47 +0200
        Re: using Map Andrew Poulos <ap_prog@hotmail.com> - 2018-06-14 21:52 +1000
          Re: using Map Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2018-06-14 14:31 +0200
            Re: using Map Andrew Poulos <ap_prog@hotmail.com> - 2018-06-14 23:52 +1000
              Re: using Map Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2018-06-14 17:13 +0200
                Re: using Map "Mark-" <nospam@mapson.xyz> - 2018-06-14 16:25 +0000
          Re: using Map "Evertjan." <exxjxw.hannivoort@inter.nl.net> - 2018-06-14 16:11 +0200
  Re: get set value in array of objects Ben Bacarisse <ben.usenet@bsb.me.uk> - 2018-06-12 16:40 +0100
    Re: get set value in array of objects Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2018-06-13 05:18 +0200
      Re: get set value in array of objects Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2018-06-13 05:25 +0200
  Re: get set value in array of objects Julio Di Egidio <julio@diegidio.name> - 2018-06-14 07:11 -0700

csiph-web