【问题标题】:How can I achieve the result with the least complexity?我怎样才能以最少的复杂性获得结果?
【发布时间】:2018-10-15 13:57:52
【问题描述】:

我有一个这样的嵌套对象 -

finalObj = {

"1" : {
    "1" : 0.6,
    "2" : 0.3,
    "3" : 0.1,
    "score" : "a,b"
},
"3" : {
    "2" : 0.4,
    "3" : 0.4,
    "4" : 0.2,
    "score" : "c,d"
},
"4" : {
    "1" : 0.6,
    "4" : 0.4,
    "score" : "e,f"
}

}

var newObj = {
    "1": [0.6 * (a / b) + 0.6 * (e / f)] / (0.6 + 0.6),
    "2": [0.3 * (a / b) + 0.4 * (c / d)] / (0.6 + 0.4),
    "3": [0.1 * (a / b) + 0.4 * (c / d)] / (0.1 + 0.4),
    "4": [0.2 * (c / d) + 0.4 * (e / f)] / (0.2 + 0.4)
}

var obj = {};
for (let key in finalObj) {
    console.log(key) // "1" , "3" , "4" 
    for (let bey in finalObj[key]) {
        if (bey !== "score") {
            var x = finalObj[key]["score"].split(",")
            if (obj.hasOwnProperty(bey)) {
                console.log(x[0] + " if  " + x[1])
                obj[bey] += finalObj[key][bey] * x[0] / x[1]
            }
            else {
                console.log(x[0] + " else " + x[1])

                obj[bey] = finalObj[key][bey] * x[0] / x[1]
            }
        }

    }
}

其中外部对象的键引用"question_id",内部嵌套对象的键引用"skills_id"及其权重,"scores"在一个用逗号分隔的字符串中有两个值。示例 - "1", "3", "4" 是 question_ids。 问题 id "1" : "1", "2", "3" 是指该问题的技能 id。“分数”有“a(获得的分数),b(总分)”

我想返回另一个具有技能 id 的对象及其标准化分数 - newObj

//其中“1”、“2”、“3”、“4”都是用上面的公式归一化的技能ID。

//我需要使用多少个循环来实现这一点?这是 // 将数据放入嵌套对象的正确方法吗?

// 我现在正在尝试这样的事情 - // 请帮忙 - //我得到了输出但是代码看起来很奇怪!

【问题讨论】:

  • 请同时添加结果。
  • 对于 a,b = 45,50 c,d = 35,40 e,f = 5,10 obj = {"1":0.8400000000000001,"2":0.62,"3":0.43999999999999995 ,"4":0.375}
  • 你只有左边的总和,但数字没有除以0.6 + 0.6的总和作为第一个值。第一个结果应该是0.7
  • 是的,没错。处理。谢谢

标签: javascript node.js algorithm


【解决方案1】:

我会提前收集左右值进行求和,并在最后一步构建除法的结果。

为了取值,我建议使用带有相应键的适当对象。

var data = { 1: { 1: 0.6, 2: 0.3, 3: 0.1, score: "a,b" }, 3: { 2: 0.4, 3: 0.4, 4: 0.2, score: "c,d" }, 4: { 1: 0.6, 4: 0.4, score: "e,f" } },
    values = { a: 45, b: 50, c: 35, d: 40, e: 5, f: 10 },
    collection = {},
    div = (a, b) => a / b,
    result;

Object
    .entries(data)
    .forEach(([k, o]) => Object
        .entries(o)
        .filter(([l]) => l !== 'score')
        .forEach(([l, v]) => {
            collection[l] = collection[l] || { left: 0, right: 0 };
            collection[l].left += v * o.score.split(',').map(k => values[k]).reduce(div);
            collection[l].right += v;
        })
    );

result = Object.assign(...Object
    .entries(collection)
    .map(([k, o]) => ({ [k]: o.left / o.right }))
);

console.log(result);
console.log(collection);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2011-06-04
    • 1970-01-01
    • 2017-05-25
    相关资源
    最近更新 更多