Первый - это глобальный список продуктов (скажем, 10 продуктов), каждый из которых содержит код и количество, большее или равное 0 (это важно).

Второй - это список продуктов (скажем, 3), каждый из которых содержит код (такой же, как в первой таблице) и количество, равное 0.

Я хочу отфильтровать первый массив и получить массив с 3 продуктами, но сохранить количество первого, например:

   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"
        }
    ];

Разница между action.value.Data и result - qte каждого продукта.

Я пробовал:

  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,
}

Но таблица result дает мне 6 продуктов вместо 3 (всегда двойных), а qte всегда 0, так как отфильтровать массив state.Data и оставить только те продукты, которые имеют одинаковые код как в массиве action.value.Data

1
zedArt 16 Янв 2021 в 19:19

4 ответа

Лучший ответ

На самом деле я не могу понять логику вашего кода. Решение предельно простое

// 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))

Это оно

2
Dmitry Reutov 16 Янв 2021 в 16:27

Это легко сделать с помощью одного лайнера. Все, что вам нужно сделать, это отфильтровать первый массив, проверяя, какие элементы находятся во втором массиве:

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

Вы получаете именно ту ценность, которую хотите.

1
Danielo515 16 Янв 2021 в 16:39
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)
0
cars10m 16 Янв 2021 в 16:39

Вы можете просто отфильтровать глобальные продукты на основе code в action.value.Data, но вы также можете попробовать следующее решение, чтобы избежать вложенных циклов.

Создайте карту с code в качестве ключей и qte в качестве значений и используйте ее при отображении 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)
0
Ramesh Reddy 16 Янв 2021 в 16:45
65751770