Javascript 从两个数组中获取同一对象的数组
第一个是产品的全局列表(比如10个产品),每个产品包含一个代码和大于或等于0的数量。(这很重要) 第二个是产品列表(例如3),每个产品包含一个代码(与第一个表中相同)和一个等于0的数量 我想过滤第一个数组,并拥有一个包含3个乘积的数组,但保留第一个数组的数量 例如:Javascript 从两个数组中获取同一对象的数组,javascript,arrays,json,react-native,object,Javascript,Arrays,Json,React Native,Object,第一个是产品的全局列表(比如10个产品),每个产品包含一个代码和大于或等于0的数量。(这很重要) 第二个是产品列表(例如3),每个产品包含一个代码(与第一个表中相同)和一个等于0的数量 我想过滤第一个数组,并拥有一个包含3个乘积的数组,但保留第一个数组的数量 例如: state.Data = [ { "code": "0", "qte": "0"
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
数组中代码相同的产品,我实际上无法理解代码的逻辑。解决方案非常简单
// 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))
就这样我实际上无法理解您代码的逻辑。解决方案非常简单
// 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))
就是这样您可以根据
action.value.Data
中的code
s筛选全局产品,但您也可以尝试以下解决方案以避免嵌套循环
创建一个映射,将code
作为键,qte
作为值,并在映射action.value.Data
时使用它
const全局=[{
“代码”:“0”,
“qte”:“0”
},
{
“代码”:“1”,
“qte”:“0”
},
{
“代码”:“2”,
“qte”:“14”
},
{
“代码”:“3”,
“qte”:“14”
},
{
“代码”:“4”,
“qte”:“0”
},
{
“代码”:“5”,
“qte”:“0”
},
{
“代码”:“6”,
“qte”:“0”
},
{
“代码”:“7”,
“qte”:“0”
},
{
“代码”:“8”,
“qte”:“0”
},
{
“代码”:“9”,
“qte”:“0”
}
];
常数bla=[{
“代码”:“0”,
“qte”:“0”
},
{
“代码”:“2”,
“qte”:“0”
},
{
“代码”:“3”,
“qte”:“0”
}
];
constcodevsqty=newmap(global.Map({code,qte})=>[code,qte]);
const result=bla.map(({code})=>({code,qte:codevskty.get(code}));
console.log(result)
您可以根据action.value.Data
中的code
s筛选全局产品,但也可以尝试以下解决方案以避免嵌套循环
创建一个映射,将code
作为键,qte
作为值,并在映射action.value.Data
时使用它
const全局=[{
“代码”:“0”,
“qte”:“0”
},
{
“代码”:“1”,
“qte”:“0”
},
{
“代码”:“2”,
“qte”:“14”
},
{
“代码”:“3”,
“qte”:“14”
},
{
“代码”:“4”,
“qte”:“0”
},
{
“代码”:“5”,
“qte”:“0”
},
{
“代码”:“6”,
“qte”:“0”
},
{
“代码”:“7”,
“qte”:“0”
},
{
“代码”:“8”,
“qte”:“0”
},
{
“代码”:“9”,
“qte”:“0”
}
];
常数bla=[{
“代码”:“0”,
“qte”:“0”
},
{
“代码”:“2”,
“qte”:“0”
},
{
“代码”:“3”,
“qte”:“0”
}
];
constcodevsqty=newmap(global.Map({code,qte})=>[code,qte]);
const result=bla.map(({code})=>({code,qte:codevskty.get(code}));
console.log(result)
这可以用一个班轮轻松完成。您只需过滤第一个数组,检查第二个数组中有哪些项:
const result=state.Data.filter({code})=>
action.value.Data.some(x=>x.code==code))
console.log(结果)
您可以准确地获得所需的值。只需一行即可轻松完成此操作。您只需过滤第一个数组,检查第二个数组中有哪些项:
const result=state.Data.filter({code})=>
action.value.Data.some(x=>x.code==code))
console.log(结果)
您得到的正是您想要的值。
const state={数据:[
{“代码”:“0”,“qte”:“0”},{“代码”:“1”,“qte”:“0”},{“代码”:“2”,“qte”:“14”},{“代码”:“3”,“qte”:“14”},
{“代码”:“4”,“qte”:“0”},{“代码”:“5”,“qte”:“0”},{“代码”:“6”,“qte”:“0”},{“代码”:“7”,“qte”:“0”},
{“代码”:“8”,“qte”:“0”},{“代码”:“9”,“qte”:“0”}
]},
操作={值:{数据:[
{“代码”:“0”,“qte”:“0”},{“代码”:“2”,“qte”:“0”},{“代码”:“3”,“qte”:“0”}
]}};
const res=state.Data.filter(o=>action.value.Data.some(a=>a.code==o.code));
console.log(res)
const state={数据:[
{“代码”:“0”,“qte”:“0”},{“代码”:“1”,“qte”:“0”},{“代码”:“2”,“qte”:“14”},{“代码”:“3”,“qte”:“14”},
{“代码”:“4”,“qte”:“0”},{“代码”:“5”,“qte”:“0”},{“代码”:“6”,“qte”:“0”},{“代码”:“7”,“qte”:“0”},
{“代码”:“8”,“qte”:“0”},{“代码”:“9”,“qte”:“0”}
]},
操作={值:{数据:[
{“代码”:“0”,“qte”:“0”},{“代码”:“2”,“qte”:“0”},{“代码”:“3”,“qte”:“0”}
]}};
const res=state.Data.filter(o=>action.value.Data.some(a=>a.code==o.code));
console.log(res)
Danielo515击败我,干得好!:达尼洛515击败我,干得好D