Javascript 中 Object.entries 的数组解构
Array destructing from Object.entries in Javascript
这里是有问题的代码:
const posts = [{
data: {
id: 1,
date: "2019-02-03",
ev_filter_1: ["art", "foodie"],
ev_filter_2: ["value1", "value2"],
ev_filter_3: ["value1", "value2"],
ev_filter_4: ["all", "12+"]
}
},
{
data: {
id: 2,
date: "",
ev_filter_1: ["arti", "foodie"],
ev_filter_2: ["value1", "value2"],
ev_filter_3: ["value1", "value2"],
ev_filter_4: ["all", "19+"]
}
},
{
data: {
id: 3,
date: "2019-02-03",
ev_filter_1: ["art", "foodie"],
ev_filter_2: ["value1", "value75"],
ev_filter_3: ["value1", "value2"],
ev_filter_4: ["all", "12+"]
}
}
];
function sift2(arrObjLit, pattern, ...values) {
const toMatch = new Set(values)
const result = arrObjLit.map(o => o.data)
.filter(o =>
Object.entries(o)
.filter(([k, v]) => {
console.log(`${k}: ${v}`)
return true
})
.filter(([k, v]) => k.startsWith(pattern))
.filter(([k, v]) => Array.isArray(v))
.filter(([k, v]) => toMatch.has(v))
.length > 0
)
return result;
}
console.log(...sift2(posts, "ev_", "value75", "12+"));
这让我很困惑。基于
我希望 filter
中的数组破坏是错误的。然而,事实并非如此。这正是我要找的。为什么在 filter
方法中破坏是平的?我观察错了吗?
.filter(o =>
Object.entries(o)
.filter(([k, v]) => k.startsWith(pattern))
因为您现在正确地嵌套了迭代,直接在 entries
的输出上调用第二个 filter
。请注意,您正在使用
.filter(o => Object.entries(o).filter(…).… )
而不是
.map(Object.entries).filter(o => o.… )
也就是说,我会将您的函数重写为
function sift2(arrObjLit, pattern, ...values) {
const toMatch = new Set(values)
return arrObjLit.filter(o =>
Object.entries(o.data)
.some(([k, v]) => {
console.log(`${k}: ${v}`);
return k.startsWith(pattern)
&& Array.isArray(v)
&& v.some(x => toMatch.has(x));
})
);
}
这里是有问题的代码:
const posts = [{
data: {
id: 1,
date: "2019-02-03",
ev_filter_1: ["art", "foodie"],
ev_filter_2: ["value1", "value2"],
ev_filter_3: ["value1", "value2"],
ev_filter_4: ["all", "12+"]
}
},
{
data: {
id: 2,
date: "",
ev_filter_1: ["arti", "foodie"],
ev_filter_2: ["value1", "value2"],
ev_filter_3: ["value1", "value2"],
ev_filter_4: ["all", "19+"]
}
},
{
data: {
id: 3,
date: "2019-02-03",
ev_filter_1: ["art", "foodie"],
ev_filter_2: ["value1", "value75"],
ev_filter_3: ["value1", "value2"],
ev_filter_4: ["all", "12+"]
}
}
];
function sift2(arrObjLit, pattern, ...values) {
const toMatch = new Set(values)
const result = arrObjLit.map(o => o.data)
.filter(o =>
Object.entries(o)
.filter(([k, v]) => {
console.log(`${k}: ${v}`)
return true
})
.filter(([k, v]) => k.startsWith(pattern))
.filter(([k, v]) => Array.isArray(v))
.filter(([k, v]) => toMatch.has(v))
.length > 0
)
return result;
}
console.log(...sift2(posts, "ev_", "value75", "12+"));
这让我很困惑。基于 filter
中的数组破坏是错误的。然而,事实并非如此。这正是我要找的。为什么在 filter
方法中破坏是平的?我观察错了吗?
.filter(o =>
Object.entries(o)
.filter(([k, v]) => k.startsWith(pattern))
因为您现在正确地嵌套了迭代,直接在 entries
的输出上调用第二个 filter
。请注意,您正在使用
.filter(o => Object.entries(o).filter(…).… )
而不是
.map(Object.entries).filter(o => o.… )
也就是说,我会将您的函数重写为
function sift2(arrObjLit, pattern, ...values) {
const toMatch = new Set(values)
return arrObjLit.filter(o =>
Object.entries(o.data)
.some(([k, v]) => {
console.log(`${k}: ${v}`);
return k.startsWith(pattern)
&& Array.isArray(v)
&& v.some(x => toMatch.has(x));
})
);
}