wankdanker / node-object-mapper

Copy properties from one object to another.
MIT License
276 stars 73 forks source link

Transform runs multiple times in nested array #77

Open jxeeno opened 4 years ago

jxeeno commented 4 years ago

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.

PasVV commented 4 years ago

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 commented 4 years ago

Problem reveals on 6.0.1 => 6.1.0 update.

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

gitricko commented 4 years ago

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

denisdnc commented 4 years ago

Same issue using "6.2.0"

brunomillerps commented 4 years ago

I had the same issue using version 6.2.0

mwiesmueller commented 3 years ago

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

henryjw commented 3 years ago

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))
mhuijser commented 3 years ago

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 !

abhinavjuneja commented 1 year ago

is there any update on this?

peterbarretto commented 5 months ago

Is there any update on this issue?