Linh Nguyễn
Linh Nguyễn

Reputation: 275

Remove object in array by id javascript

I have two arrays like so:

const data = [
    {
        createOn: "2021-02-06T18:03",
        data: [
            {id: "1612634593915", createOn: "2021-02-06T18:03:13.915"},
            {id: "1612634622462", createOn: "2021-02-06T18:03:42.462"},
            {id: "1612634584081", createOn: "2021-02-06T18:03:04.081"},
        ]
    },
    {
        createOn: "2021-02-06T18:02",
        data: [
            {id: "1612634576145", createOn: "2021-02-06T18:02:56.145"},
            {id: "1612634557111", createOn: "2021-02-06T18:02:37.110"}
        ]
    }
]
const listId = ['1612634622462', '1612634557111'];

Then I try to remove object in array by id in listId

const remove = data.map(re => {
    re.data.filter(item => {
        return !listId.includes(item.id);
    })
});

But when I log it out, I got [undefined, undefined].

I want array return like so after remove:

const data = [
    {
        createOn: "2021-02-06T18:03",
        data: [
            {id: "1612634593915", createOn: "2021-02-06T18:03:13.915"},
            {id: "1612634584081", createOn: "2021-02-06T18:03:04.081"},
        ]
    },
    {
        createOn: "2021-02-06T18:02",
        data: [
            {id: "1612634576145", createOn: "2021-02-06T18:02:56.145"}
        ]
    }
]

Can you help me. Thank you :))

Upvotes: 2

Views: 561

Answers (4)

blank42
blank42

Reputation: 1

Sure not the best solution, but I would loop through each data object and filter the data array for each listId Object. Just like this:

data.forEach(element => {
  listId.forEach(removeId => {
    element.data = element.data.filter(e.id => e.id !== removeId);
  });
});

Upvotes: 0

Mamun
Mamun

Reputation: 68923

You should return the result from .map():

const data = [
    {
        createOn: "2021-02-06T18:03",
        data: [
            {id: "1612634593915", createOn: "2021-02-06T18:03:13.915"},
            {id: "1612634622462", createOn: "2021-02-06T18:03:42.462"},
            {id: "1612634584081", createOn: "2021-02-06T18:03:04.081"},
        ]
    },
    {
        createOn: "2021-02-06T18:02",
        data: [
            {id: "1612634576145", createOn: "2021-02-06T18:02:56.145"},
            {id: "1612634557111", createOn: "2021-02-06T18:02:37.110"}
        ]
    }
]
const listId = ['1612634622462', '1612634557111'];

const remove = data.map(re => {
    re.data = re.data.filter(item => {
        return !listId.includes(item.id);
    });
    return re; // return here
});
console.log(remove);

Upvotes: 1

Nghi Nguyen
Nghi Nguyen

Reputation: 950

const data = [
    {
        createOn: "2021-02-06T18:03",
        data: [
            {id: "1612634593915", createOn: "2021-02-06T18:03:13.915"},
            {id: "1612634622462", createOn: "2021-02-06T18:03:42.462"},
            {id: "1612634584081", createOn: "2021-02-06T18:03:04.081"},
        ]
    },
    {
        createOn: "2021-02-06T18:02",
        data: [
            {id: "1612634576145", createOn: "2021-02-06T18:02:56.145"},
            {id: "1612634557111", createOn: "2021-02-06T18:02:37.110"}
            ]
        
    }
]
const listId = ['1612634622462', '1612634557111'];

const newData = data.map(item => {
  item.data = item.data.filter(item => !listId.includes(item.id))
  return item
})

console.log(newData)

Upvotes: 2

Mike B
Mike B

Reputation: 2784

Your initial problem is that your inner map() function doesn't doesn't return a value - for each object in the data array. That's why is returned undefined for both iterations. Also - If you filter() the array, you have to reassign it to itself to keep only filtered elements.

data.forEach(re => {
    re.data = re.data.filter(item => {
        return !listId.includes(item.id);
    })
});

Upvotes: 0

Related Questions