比较两个对象以在javascript中创建新的对象数组
我有两种元素的水果和板条箱比较两个对象以在javascript中创建新的对象数组,javascript,arrays,typescript,ecmascript-6,Javascript,Arrays,Typescript,Ecmascript 6,我有两种元素的水果和板条箱 水果是一个数组,包含不同水果的列表,如: ["apple","orange","mango","pear"] 板条箱是一组包含水果的物体,如: [{id:1,fruit_name: "apple"},{id:2, fruit_name: "pear"}] 我想基于以下条件创建一个新的对象数组: -检查任何板条箱阵列中是否存在水果阵列中的实体 如果存在,则最后一个对象应具有水果名称属性以及另一个名为测试的属性设置为真。 如果不存在,则测试的应为false 考虑到上述
水果
是一个数组,包含不同水果的列表,如:
["apple","orange","mango","pear"]
板条箱
是一组包含水果的物体,如:
[{id:1,fruit_name: "apple"},{id:2, fruit_name: "pear"}]
我想基于以下条件创建一个新的对象数组:
-检查任何板条箱阵列中是否存在水果阵列中的实体
如果存在,则最后一个对象应具有水果名称
属性以及另一个名为测试的属性
设置为真
。
如果不存在,则测试的应为false
考虑到上述情况,最终输出应如下所示:
[
{fruit_name: "apple", tested: true},
{fruit_name: "orange", tested: false},
{fruit_name: "mango", tested: false},
{fruit_name: "pear", tested: true},
]
fruits.forEach(x => {
crates.filter((y) => {
let temp;
if (x == y.fruit_name) {
temp = {
fruit: x,
tested: true
}
}
else {
temp = {
time: x,
tested: false
}
}
testedCrates.push(temp);
})
})
[
{fruit: "apple", tested: true},
{time: "apple", tested: false},
{time: "orange", tested: false},
{time: "orange", tested: false},
{time: "mango", tested: false},
{time: "mango", tested: false},
{time: "pear", tested: false},
{time: "pear", tested: false}
]
我的尝试如下:
[
{fruit_name: "apple", tested: true},
{fruit_name: "orange", tested: false},
{fruit_name: "mango", tested: false},
{fruit_name: "pear", tested: true},
]
fruits.forEach(x => {
crates.filter((y) => {
let temp;
if (x == y.fruit_name) {
temp = {
fruit: x,
tested: true
}
}
else {
temp = {
time: x,
tested: false
}
}
testedCrates.push(temp);
})
})
[
{fruit: "apple", tested: true},
{time: "apple", tested: false},
{time: "orange", tested: false},
{time: "orange", tested: false},
{time: "mango", tested: false},
{time: "mango", tested: false},
{time: "pear", tested: false},
{time: "pear", tested: false}
]
问题是,它返回每个水果两次,同时返回测试属性的两个值
我得到的结果如下:
[
{fruit_name: "apple", tested: true},
{fruit_name: "orange", tested: false},
{fruit_name: "mango", tested: false},
{fruit_name: "pear", tested: true},
]
fruits.forEach(x => {
crates.filter((y) => {
let temp;
if (x == y.fruit_name) {
temp = {
fruit: x,
tested: true
}
}
else {
temp = {
time: x,
tested: false
}
}
testedCrates.push(temp);
})
})
[
{fruit: "apple", tested: true},
{time: "apple", tested: false},
{time: "orange", tested: false},
{time: "orange", tested: false},
{time: "mango", tested: false},
{time: "mango", tested: false},
{time: "pear", tested: false},
{time: "pear", tested: false}
]
请建议对此进行一些修复。
此外,如果有更好的方法使用es6实现这一点,那么这种方法将非常有用。
提前感谢。创建一组存在于板条箱中的水果,然后将水果阵列转换为想要的形式:
constfruits=[“苹果”、“橘子”、“芒果”、“梨”]
const板条箱=[{id:1,水果名称:“苹果”},{id:2,水果名称:“梨”}];
const cratesSet=新集合(crates.map({fruit_name})=>fruit_name));
const result=fruits.map((水果名称)=>({
水果名,
测试:板条箱已安装(水果名称)
}));
控制台日志(结果)
您可以为板条箱
选择一个数组,并在检查集合时迭代水果
,以获得一个新数组
var-fruits=[“苹果”、“橙子”、“芒果”、“梨”],
板条箱=[{id:1,水果名称:“苹果”},{id:2,水果名称:“梨”}],
cSet=新集合(crates.map({fruit_name})=>fruit_name)),
result=fruits.map(fruit\u name=>({fruit\u name,tested:cSet.has(fruit\u name)}));
控制台日志(结果)代码>
作为控制台包装{max height:100%!important;top:0;}
您可以使用数组#map
和数组#some
检查板条箱中是否有水果
var-fruits=[“苹果”、“橙子”、“芒果”、“梨”],
板条箱=[{id:1,水果名称:“苹果”},{id:2,水果名称:“梨”}];
var result=fruits.map(fruit=>{
var测试=板条箱。一些({fruit_name}=>fruit_name==水果);
返回{'fruit_name':水果,已测试};
});
控制台日志(结果)代码>虽然此代码可以回答问题,但提供关于如何和/或为什么解决问题的附加上下文将提高答案的长期价值。虽然此代码可以回答问题,但提供关于如何和/或为什么解决问题的附加上下文将提高答案的长期价值。