zedArt
zedArt

Reputation: 485

Get array of same object from two arrays

the first one is a global list of products (say 10 products) that each product contains a code and a quantity greater than or equal to 0. (this is important)

the second is a list of products (say 3) that each product contains a code (the same as in the first table) and a quantity equal to 0.

I want to filter the first array and have an array with 3 product but keep the quantities of the first one for example:

   state.Data = [
        {
            "code": "0",
            "qte": "0"
        },
        {
            "code": "1",
            "qte": "0"
        },
        {
            "code": "2",
            "qte": "14"
        },
        {
            "code": "3",
            "qte": "14"
        },
        {
            "code": "4",
            "qte": "0"
        },
        {
            "code": "5",
            "qte": "0"
        },
        {
            "code": "6",
            "qte": "0"
        },
        {
            "code": "7",
            "qte": "0"
        },
        {
            "code": "8",
            "qte": "0"
        },
        {
            "code": "9",
            "qte": "0"
        }
    ];
    action.value.Data = [
        {
            "code": "0",
            "qte": "0"
        },
        {
            "code": "2",
            "qte": "0"
        },
        {
            "code": "3",
            "qte": "0"
        }
    ];
 // what I want:
    result = [
        {
            "code": "0",
            "qte": "0"
        },
        {
            "code": "2",
            "qte": "14"
        },
        {
            "code": "3",
            "qte": "14"
        }
    ];

the difference between action.value.Data and result is qte of each product.

I had tried:

  const mainData = [...action.value.Data,...state.Data];
  var catData = mainData.reduce((p, c) => {
    p[c.code] = (p[c.code] || 0) ;
    return p;
  }, {});
  
  var result = mainData.filter((obj) => {
    return catData[obj.code] >= 0;
  });
nextState = {
  ...state,

  Data: result,
}

but the result table gives me 6 products instead of 3 (always double) and the qte is always 0, so how to filter the state.Data array and keep only the products which have the same code as in the action.value.Data array

Upvotes: 1

Views: 95

Answers (4)

Ramesh Reddy
Ramesh Reddy

Reputation: 10652

You can just filter the global products based on the codes in action.value.Data but you can also try the below solution to avoid nested loops.

Create a map with code as keys, qte as values and use it while mapping the action.value.Data.

const global = [{
    "code": "0",
    "qte": "0"
  },
  {
    "code": "1",
    "qte": "0"
  },
  {
    "code": "2",
    "qte": "14"
  },
  {
    "code": "3",
    "qte": "14"
  },
  {
    "code": "4",
    "qte": "0"
  },
  {
    "code": "5",
    "qte": "0"
  },
  {
    "code": "6",
    "qte": "0"
  },
  {
    "code": "7",
    "qte": "0"
  },
  {
    "code": "8",
    "qte": "0"
  },
  {
    "code": "9",
    "qte": "0"
  }
];
const bla = [{
    "code": "0",
    "qte": "0"
  },
  {
    "code": "2",
    "qte": "0"
  },
  {
    "code": "3",
    "qte": "0"
  }
];

const codeVsQty = new Map(global.map(({code, qte}) => [code, qte]));

const result = bla.map(({code}) => ({code, qte: codeVsQty.get(code)}));

console.log(result)

Upvotes: 0

Carsten Massmann
Carsten Massmann

Reputation: 28196

const state = {Data:[
   {"code": "0","qte": "0"},{"code": "1","qte": "0"},{"code": "2","qte": "14"},{"code": "3","qte": "14"},
   {"code": "4","qte": "0"},{"code": "5","qte": "0"},{"code": "6","qte": "0"},{"code": "7","qte": "0"},
   {"code": "8","qte": "0"},{"code": "9","qte": "0"}
]},
 action = {value:{Data:[
   {"code": "0","qte": "0"},{"code": "2","qte": "0"},{"code": "3","qte": "0"}
]}};

const res = state.Data.filter(o=>action.value.Data.some(a=>a.code==o.code));

console.log(res)

Upvotes: 0

Danielo515
Danielo515

Reputation: 7051

This can be easily done with one liner. All you want to do is filter the first array checking which items are on the second array:

const result = state.Data.filter(({code}) => 
               action.value.Data.some(x => x.code === code))
console.log(result)

You get exactly the value you want.

Upvotes: 1

Dmitry Reutov
Dmitry Reutov

Reputation: 3032

I can not understand the logic of your code actually. Solution is extremely simple

// step 1: getting keys
const keys = action.value.Data.map(v => v.code)

// step 2: filter values with these keys
const values = state.Data.filter(v => keys.includes(v.code))

That's it

Upvotes: 2

Related Questions