Javascript 如何在另一个数组中找到数组的值,然后相应地设置数据?
我有第一个数组:Javascript 如何在另一个数组中找到数组的值,然后相应地设置数据?,javascript,arrays,reactjs,object,filter,Javascript,Arrays,Reactjs,Object,Filter,我有第一个数组: const arrayOne = [ {number: "DS5.11", name: "nameOne"}, {number: "DS5.11", name: "nameTwo"}, {number: "D5.10", name: "NameThree"} ] 然后是第二个数组。与第一个类似: const arrayOne = [
const arrayOne = [
{number: "DS5.11", name: "nameOne"},
{number: "DS5.11", name: "nameTwo"},
{number: "D5.10", name: "NameThree"}
]
然后是第二个数组。与第一个类似:
const arrayOne = [
{number: "DS5.11", name: "nameFour"},
{number: "DS5.85", name: "nameFive"},
{number: "D5SA1", name: "NameSix"}
]
如您所见,第一个数组的第一个和第二个数值等于第二个数组的相同第一个数值。所以我一直在尝试做的是过滤第一个数组,检查数字,基本上,如果第一个数组中有一个数字在第二个数组中重复,就会创建一个新对象
比如:
let arrayThree = []
arrayOne.filter((e,i) => {
arrayTwo.map((obj,idx) => { if(obj.number === e.number) {
arrayThree[i] = {key: value}
}})
})
另外,我希望这个新对象的索引号与第一个数组和第二个数组之间的匹配数相同
我做错了什么?提前感谢。如果您使用lodash,以下代码应该可以工作
const arrayOne = [
{number: "DS5.11", name: "nameOne"},
{number: "DS5.11", name: "nameTwo"},
{number: "D5.10", name: "NameThree"}
]
const arrayTwo = [
{number: "DS5.11", name: "nameFour"},
{number: "DS5.85", name: "nameFive"},
{number: "D5SA1", name: "NameSix"}
]
console.log(_.intersectionBy(arrayOne,arrayTwo,"number"))
如果要保存arrayOne的
name
属性,则
let arrayThree = [];
arrayOne.filter((e,i) => {
arrayTwo.map((obj,idx) => { if(obj.number === e.number) {
arrayThree[i] = e;
}})
})
类似地,保存arrayTwo的name
属性
let arrayThree = [];
arrayOne.filter((e,i) => {
arrayTwo.map((obj,idx) => { if(obj.number === e.number) {
arrayThree[i] = obj;
}})
})
我不知道我是否理解正确,但以下是我的解决方案:
arrayOne.filter(obj1 => {
for (obj2 of arrayTwo) {
if (obj1.number === obj2.number) {
arrayThree.push({ key: obj1.number });
return false;
} else {
return true;
}
}
});
此方法过滤ArrayOne值,并将重复的数字保存在ArrayTree中。
ArrayTwo保持不变。使用数组1创建一个数字到元素数组的映射
const intersectionMap = arrayOne.reduce(
(obj, el) => {
if (!obj[el.number]) obj[el.number] = [];
obj[el.number].push(el)
return obj;
},
{}
);
迭代数组2,若交集映射有键,将元素推入数组
arrayTwo.forEach(el => obj[el.number]?.push(el));
过滤掉长度为1的数组并展平结果数组
const res = Object.values(obj).flatMap(arr => arr.length > 1 ? arr : []);
没有嵌套循环,因此运行时复杂性O(n)
const arrayOne=[
{编号:“DS5.11”,名称:“nameOne”},
{编号:“DS5.11”,名称:“nametoo”},
{编号:“D5.10”,名称:“nametree”}
];
常数数组two=[
{编号:“DS5.11”,名称:“nameFour”},
{编号:“DS5.85”,名称:“nameFive”},
{编号:“D5SA1”,名称:“NameSix”}
];
const intersectionMap=arrayOne.reduce(
(obj,el)=>{
如果(!对象[el.number])对象[el.number]=[];
对象[el.编号].推送(el)
返回obj;
},
{}
);
arrayTwo.forEach(el=>intersectionMap[el.number]?.push(el));
const res=Object.values(intersectionMap).flatMap(arr=>arr.length>1?arr:[]);
控制台日志(res)
能否请您指定最终的Arraythree
的外观。请在问题中添加预期输出。map
和filter
返回新数组。是否要在输出中包含两个数组的并集/交集?请提供一个预期输出的示例。此解决方案运行良好。有lodash的也有,但我宁愿不用外部图书馆。谢谢