javascript - 如何暴力破解对象的值?
问题描述
我有一组具有数字坐标 (x,y) 和名称的对象。
我想对一个范围内的 x 和 y 的每个值强制 x 和 y。(说 [0,1,2,3,4,5])
var variables = {"aboutTitle_x": 0, "aboutTitle_y": 0}
let f = (a, b) => [].concat(...a.map(a => b.map(b => [].concat(a, b))));
let cartesian = (a, b, ...c) => b ? cartesian(f(a, b), ...c) : a;
var candidates = cartesian(Object.keys(variables), [0, 1,2,3,4,5]);
console.log(candidates);
我正在使用笛卡尔积,这给了我每项任务,如下所示:
["aboutTitle_x", 0]
["aboutTitle_x", 1]
["aboutTitle_x", 2]
["aboutTitle_x", 3]
["aboutTitle_x", 4]
["aboutTitle_x", 5]
["aboutTitle_y", 0]
["aboutTitle_y", 1]
["aboutTitle_y", 2]
["aboutTitle_y", 3]
我如何迭代(aboutTitle_x,aboutTitle_y)的潜在组合。我想要的是这样的东西:
{aboutTitle_x: 0, aboutTitle_y: 0}
{aboutTitle_x: 0, aboutTitle_y: 1}
{aboutTitle_x: 0, aboutTitle_y: 2}
{aboutTitle_x: 0, aboutTitle_y: 3}
{aboutTitle_x: 0, aboutTitle_y: 4}
解决方案
您可以使用递归方法,for
在值上使用循环,但使用递归递增键,并且还可以将对象引用作为当前值传递。
var variables = {
"aboutTitle_x": 0,
"aboutTitle_y": 0
}
function cartesian(keys, values, k = 0, tmp = {}) {
const r = [];
if (k >= keys.length) {
r.push({ ...tmp });
return r;
}
for (let i = 0; i < values.length; i++) {
Object.assign(tmp, {[keys[k]]: values[i]})
r.push(...cartesian(keys, values, k + 1, tmp))
}
return r;
}
var candidates = cartesian(Object.keys(variables), [0, 1, 2, 3, 4, 5]);
console.log(candidates);
您也可以使用reduce
方法而不是for
循环来执行此操作。
var variables = {
"aboutTitle_x": 0,
"aboutTitle_y": 0
}
function cartesian(keys, values, k = 0, tmp = {}) {
return values.reduce((r, e) => {
tmp[keys[k]] = e;
if (k >= keys.length - 1) {
r.push({ ...tmp});
return r;
}
r.push(...cartesian(keys, values, k + 1, tmp))
return r;
}, [])
}
var candidates = cartesian(Object.keys(variables), [0, 1, 2, 3, 4, 5]);
console.log(candidates);
您还可以将递归与生成器一起使用,这将使您能够控制每次迭代。
var variables = {
"aboutTitle_x": 0,
"aboutTitle_y": 0
}
function* cartesian(keys, values, k = 0, tmp = {}) {
if (k >= keys.length) {
yield { ...tmp }
} else {
for (let i = 0; i < values.length; i++) {
Object.assign(tmp, { [keys[k]]: values[i] })
yield* cartesian(keys, values, k + 1, tmp)
}
}
}
var it = cartesian(Object.keys(variables), [0, 1, 2, 3, 4, 5]);
for (let i of it) {
console.log(i)
}
推荐阅读
- dependencies - 无法附加模块信息的依赖项
- yii - Yii1 - 防止分页(dataProvider)计数,或缓存它
- android - 无法获取通知数据,当应用程序处于后台或在 React-native-firebase android 中关闭时正文
- cd-rom - CIRC 编码器中的 CDROM、F2 Reed-Solomon PQ 码
- java - 为什么变量 x 不采用我给出的值,并且当传递给其他类时与变量 in 相等?
- python - 尝试使 Python 项目要求无版本
- python - 获取 Pandas df 的子集,其中多个列与另一个 df 的值匹配
- nuget - 将 NuGet 包发布到本地 Apache 服务器
- javascript - 如何使用 javascript 使 div 中的文本居中
- amazon-redshift - pg_terminate_backend - 如何让非超级用户执行它?