如果键存在于JavaScript中,我想知道如何创建一个新的数组对象。
我有两个数组对象,arr1
和arr2
。在arr2
中,如果c
的值为true,并且arr1
的键和一个值相等,则将其推送到新的数组对象。如果键值的arr2
为true,并且与arr1
的键匹配,则在JavaScript中推送到一个新数组。
var arr1 = {
data:[
{id:1, place: "IN", year: "2020", mode: "ON"},
{id:3, place: "TH", year: "2022", mode: "OFF"},
{id:5, place: "AU", year: "2025", mode: "ON"}
]
};
var arr2=[
{a: "place", c: true},
{a: "year", c: true},
{a: "mode", c: false},
]
var finals = [];
var result = arr1.data.map(e=>{
arr2.forEach(i=>{
if(i.c == true && Object.keys(e)){
finals.push(e);
}
})
return finals
})
预期输出:
[
{place: "IN", year: "2020"}
{place: "TH", year: "2022"},
{place: "AU", year: "2025"}
]
你差不多到了。
- CCD_ 8创建新的阵列
- 为arr1中的每个项创建一个新对象
newObj
- 在
arr2
中的每个键上循环 - 如果
key.c
为true,则将key.a
与item
中的相应值相加 - 返回
newObj
var arr1 = {
data:[
{id:1, place: "IN", year: "2020", mode: "ON"},
{id:3, place: "TH", year: "2022", mode: "OFF"},
{id:5, place: "AU", year: "2025", mode: "ON"}
]
};
var arr2=[
{a: "place", c: true},
{a: "year", c: true},
{a: "mode", c: false},
];
var result = arr1.data.map(item => { // 1
let newObj = {}; // 2
arr2.forEach(key => { // 3
if (key.c) { // 4
newObj[key.a] = item[key.a]
}
});
return newObj // 5
})
console.log(result)
逻辑
- 从条件为
node.c === true
的arr2
获取所需密钥 - 从这个数组中的每个对象的
map
到arr1.data
,用我们从上面的逻辑中得到的键创建一个新对象 - 此汇总列表将为您提供所需的结果
var arr1 = {
data: [
{ id: 1, place: "IN", year: "2020", mode: "ON" },
{ id: 3, place: "TH", year: "2022", mode: "OFF" },
{ id: 5, place: "AU", year: "2025", mode: "ON" }
]
}
var arr2 = [
{ a: "place", c: true },
{ a: "year", c: true },
{ a: "mode", c: false },
];
const keys = arr2.filter((node) => node.c).map((node) => node.a);
var result = arr1.data.map(e => {
const obj = keys.reduce((acc, curr) => {
acc[curr] = e[curr];
return acc;
}, {});
return obj;
})
console.log(result);
可以使用.map()
和.reduce()
:
var arr1 = {
data: [
{id: 1, place: "IN", year: "2020", mode: "ON"},
{id: 3, place: "TH", year: "2022", mode: "OFF" },
{id: 5, place: "AU", year: "2025", mode: "ON" },
]
};
var arr2 = [
{a: "place", c: true},
{a: "year", c: true},
{a: "mode", c: false},
];
const result = arr1.data.map(item =>
Object.keys(item).reduce((acc, key) => {
const isEnabled = arr2.some(({a, c}) => a === key && c === true);
return isEnabled ? { ...acc, [key]: item[key]} : acc;
}, {})
);
console.log(result);
reduce
和forEach
方法:
let arr1 = { data: [{ id: 1, place: "IN", year: "2020", mode: "ON" }, { id: 3, place: "TH", year: "2022", mode: "OFF" }, { id: 5, place: "AU", year: "2025", mode: "ON" }] };
let arr2 = [{ a: "place", c: true }, { a: "year", c: true }, { a: "mode", c: false }, ]
let finals = arr1.data.reduce((acc, itm) => {
let obj = {};
arr2.forEach(({a, c}) => {
if (c) obj[a] = itm[a];
})
acc.push(obj)
return acc
}, [])
console.log(finals)
无法抗拒地使用Object.fromEntries 将另一个版本添加到混合中
const arr1 = { data:[ {id:1, place: "IN", year: "2020", mode: "ON"}, {id:3, place: "TH", year: "2022", mode: "OFF"}, {id:5, place: "AU", year: "2025", mode: "ON"} ]};
const arr2=[ {a: "place", c: true}, {a: "year", c: true}, {a: "mode", c: false},]
const props = arr2.flatMap(p=> p.c ? p.a : []);
const finals = arr1.data.map(o=> Object.fromEntries(props.map(p=>[p,o[p]])));
console.log(finals);