比较两个对象键值,返回最小分母

时间:2017-10-14 20:18:14

标签: web

我是来自Python的NodeJS的新手,并且遇到了这个练习问题。

给定两个对象(键,值对)返回它们之间的最小分母。

ObjectA = {"A": 10, "B": 20, "C": 30} "Stock"
ObjectB = {"A": 5, "B": 10, "C": 1} "Per Item"

function(objectA, objectB)会返回2,因为ObjectB可以完全“进入ObjectA 2次”。

在我的脑海中或Python中,我想循环每个键/值比较两个对象。如果键值出现故障,不确定如何以性能方式执行此操作/处理它。

不确定如何在JavaScript中迭代这些对象,我是否必须独立调用每个孩子?我如何索引它们?

main.js:

function howMany(params) {
  const {objectA, objectB} = params
  Object.keys(objectA).reduce((denominator, key) => {
    if(objectB[key] === undefined) {
      return 0;
    }
    const d = Math.floor(objectA[key] / objectB[key]);

    return d < denominator ? d : denominator;
  }, Infinity);
}

module.exports = {howMany}

var params = require('./inputs.js');
howMany(params.returnsOne);
console.log(howMany(params.returnsOne)); 

inputs.js:

module.exports = {
  returnsOne: {
    objectA: {
      a: 10,
      b: 5,
      c: 5
    },
    objectB: {
      a: 20,
      b: 10,
      c: 5
    }
  }
} 

3 个答案:

答案 0 :(得分:1)

您可以使用展开语法将所有比率传递给Math.min,然后截断结果:

&#13;
&#13;
var objectA = { A: 10, B: 20, C: 30 },
    objectB = { A: 5, B: 10, C: 1 },
    denominator = Math.floor(Math.min(...Object.keys(objectA).map( 
                                         key => objectA[key] / objectB[key] ))) || 0;
    
console.log(denominator);
&#13;
&#13;
&#13;

与您拥有的内容更加完整:

&#13;
&#13;
function howMany({objectA, objectB}) {
    return Math.floor(Math.min(...Object.keys(objectA).map( 
                                         key => objectA[key] / objectB[key] ))) || 0;
}
const params = {
  returnsOne: {
    objectA: { A: 10, B: 20, C: 30 },
    objectB: { A: 5, B: 10, C: 1 }
  }
};
console.log(howMany(params.returnsOne));
&#13;
&#13;
&#13;

答案 1 :(得分:0)

使用Object#keys迭代ObjectA的Array#reduce,并在每次迭代时将分母指定为当前最低值,如果在ObjectB中缺少键,则为0:

&#13;
&#13;
const ObjectA = {"A": 10, "B": 20, "C": 30};
const ObjectB = {"A": 5, "B": 10, "C": 1};

const findBinA = (objectA, objectB) => Object.keys(objectA)
  .reduce((denominator, key) => {
    const d = Math.floor(objectA[key] / objectB[key]) || 0;

    return d < denominator ? d : denominator;
  }, Infinity);

console.log(findBinA(ObjectA, ObjectB));
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您可以减少键并使用具有该分区的较小值的键。

var objectA = { A: 10, B: 20, C: 30 },
    objectB = { A: 5, B: 10, C: 1 },
    keys = Object.keys(objectA),
    key = keys.reduce(function (a, b) {
        var aa = Math.floor(objectA[a] / objectB[a]),
            bb = Math.floor(objectA[b] / objectB[b]);
        return aa < bb ? a : b;
    }),
    denominator = Math.floor(objectA[key] / objectB[key]);
    
console.log(denominator);