1

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

4 Answers 4

2

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

Sign up to request clarification or add additional context in comments.

Comments

1

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.

Comments

0

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)

Comments

0

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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.