node-object-mapper icon indicating copy to clipboard operation
node-object-mapper copied to clipboard

Transform runs multiple times in nested array

Open jxeeno opened this issue 5 years ago • 10 comments
trafficstars

Hello!

I have a use case where I'm trying to transform a key in a deeply nested array + object structure. See example below:

var objectMapper = require('object-mapper');
var map = {
    '[].data.children[].person_id': {key: 'entity[].humans.children[].person.id', transform: (e) => e+'_+1'},
};
var arr = [{
  "id": "1",
  "data": {
    "children": [
      {
        "person_id": "123123123"
      },
      {
        "person_id": "12312312"
      },
      {
        "relation_id": "111"
      }
    ]
  }
}];
 
var dest = objectMapper(arr, map);

console.log(JSON.stringify(dest, null, 4))

I was expecting an output of:

{
    "entity": [        {
            "humans": {
                "children": [                    {
                        "person": {
                            "id": "123123123_+1"
                        }
                    },
                    {
                        "person": {
                            "id": "12312312_+1"
                        }                    }                ]
            }
        }    ]
}

Instead, I get:

{
    "entity": [        {
            "humans": {
                "children": [                    {
                        "person": {
                            "id": "123123123,12312312_+1_+1"
                        }
                    }
                ]
            }
        }
    ]}

I'm doing some further debugging now, but it appears the transform() function gets called multiple times in the array iteration.

jxeeno avatar Mar 11 '20 03:03 jxeeno

I have updated deps of my project and i catch this bug too (object-mapper updated too from 6.0.1 to 6.2.0).

I will try localize problem.

PasVV avatar Mar 18 '20 08:03 PasVV

Problem reveals on 6.0.1 => 6.1.0 update.

@pguijarr, @wankdanker could you check this changes and help us find bug?

PasVV avatar Mar 18 '20 09:03 PasVV

ah... this is the problem...same for me #81 ... Thanks for the heads up on the version. Yes, 6.0.1 does not have this problem ! I will close #81

gitricko avatar May 07 '20 06:05 gitricko

Same issue using "6.2.0"

denisdnc avatar Aug 26 '20 20:08 denisdnc

I had the same issue using version 6.2.0

brunomillerps avatar Aug 26 '20 20:08 brunomillerps

Same issue on version 6.2.0 - This breaks the show in my project. :-(

mwiesmueller avatar Oct 05 '20 08:10 mwiesmueller

I'm seeing the same issue. My workaround is to define any properties that don't use a transform function first.

const map = {
    "foo": [
        {
            key: "y" // Works a s expected
        },
        {
            key: "foo",
            transform: function (value: string) {
                return value + "_foo";
            }
        },
        {
            key: "a" // This will use foo's transform function
        },
        {
            key: "baz",
            transform: function (value: string) {
                return value + "_baz";
            },
        }
    ],
    "bar": "x"
};

const src = {
    foo: 'blah',
    bar: 'something'
};

console.log(objectMapper.merge(src, map))

henryjw avatar Nov 06 '20 16:11 henryjw

This is quite a serieus problem. Multiple transformations are just not possible without interfering with each other. Is there an outlook on a fix ? That would be awesome !

mhuijser avatar Sep 22 '21 05:09 mhuijser

is there any update on this?

abhinavjuneja avatar May 26 '23 13:05 abhinavjuneja

Is there any update on this issue?

peterbarretto avatar Apr 12 '24 12:04 peterbarretto