如何基于javascript中存在的类条件键来获取新的数组对象



如果键存在于JavaScript中,我想知道如何创建一个新的数组对象。

我有两个数组对象,arr1arr2。在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"}
]

你差不多到了。

  1. CCD_ 8创建新的阵列
  2. 为arr1中的每个创建一个新对象newObj
  3. arr2中的每个上循环
  4. 如果key.c为true,则将key.aitem中的相应值相加
  5. 返回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 === truearr2获取所需密钥
  • 从这个数组中的每个对象的maparr1.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);

reduceforEach方法:

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

最新更新