【问题标题】:Convert object to array of type integer and sum the values将对象转换为整数类型的数组并对值求和
【发布时间】:2017-01-28 17:05:07
【问题描述】:

我想将 JavaScript 对象转换为整数类型的数组并将所有值添加到数组中并转换回对象。

到目前为止,我尝试了以下方法:

//Convert object to array
var arr = Object.keys(some_object).map(function(k){
    return some_object[k];
})

//Remove null values
var arr_without_null = arr.filter(function(n){
    return n !=  undefined;
})

//Convert array to array of type int
var arrOfNumbers = arr_without_null.map(function(x){
    return parseInt(x);
});

//Add all the values
self.sum = arrOfNumbers.reduce(add, 0);

function add(a,b){
    return a+b;
}
console.log("sum values: ", sum);

但这看起来很难看,而且我想要实现的步骤太多。有没有更好的方法来实现同样的目标?

注意:我不介意用 jquery 实现这一点,但我更喜欢 javascript。谢谢

【问题讨论】:

    标签: javascript jquery arrays javascript-objects


    【解决方案1】:

    根据您的解决方案,您可以“合并”几个步骤

    //Convert object to array
    var arr = Object.keys(self.data.CallsByDisposition).map(function(k){
        return parseInt(self.data.CallsByDisposition[k] || 0)
    })
    
    //Add all the values
    self.sum = arr.reduce(add, 0);
    
    function add(a,b){
        return a + b;
    }
    console.log("sum values: ", sum);
    

    【讨论】:

    • 嘿,同样的概念。 :-)
    • 不要忘记基数...或者使用Number(x)|0+x|0 来强制。
    【解决方案2】:

    您可以通过将null 视为0 来省略filter(因为这是一个总和),这意味着您可以将两个maps 结合起来。另请注意,您不必将第二个参数提供给 reduce 以获取总和;第一次调用将只使用前两个条目:

    self.sum =
      Object.keys(self.data.CallsByDisposition)
        .map(function(k) { return parseInt(self.data.CallsByDisposition[k] || "0"); })
        .reduce(function(s, e) { return s + e; });
    

    我们依赖于 nullfalsyand using JavaScript's curiously powerful||operator to get"0"instead ofnullto pass intoparseInt. Of course, that will also substitute"0"@ 987654333@""(andfalseandNaNand all the other falsy values), so adjust as necessary (your original code weeded out justnullandundefinedbut leftfalse,NaN`等)。

    请参阅下面的 1,了解有关 parseInt 和一般数字转换的说明。

    活生生的例子:

    var self = {
      data: {
        CallsByDisposition: {
          a: 7,
          b: 30,
          c: null,
          d: 5
        }
      }
    };
    self.sum =
      Object.keys(self.data.CallsByDisposition)
        .map(function(k) { return parseInt(self.data.CallsByDisposition[k] || "0"); })
        .reduce(function(s, e) { return s + e; });
    console.log("sum values: ", self.sum);

    使用 ES2015 及以上版本:

    self.sum =
      Object.keys(self.data.CallsByDisposition)
        .map(k => parseInt(self.data.CallsByDisposition[k] || "0"))
        .reduce((s, e) => s + e);
    

    活生生的例子:

    let self = {
      data: {
        CallsByDisposition: {
          a: 7,
          b: 30,
          c: null,
          d: 5
        }
      }
    };
    self.sum =
      Object.keys(self.data.CallsByDisposition)
        .map(k => parseInt(self.data.CallsByDisposition[k] || "0"))
        .reduce((s, e) => s + e);
    console.log("sum values: ", self.sum);

    使用Object.values,它将在 ES2017 中,今天可以填充:

    self.sum =
      Object.values(self.data.CallsByDisposition)
        .reduce((s, e) => s + parseInt(e || "0"));
    console.log("sum values: ", self.sum);
    

    活生生的例子:

    // Shim for Object.values
    const reduce = Function.bind.call(Function.call, Array.prototype.reduce);
    const isEnumerable = Function.bind.call(Function.call, Object.prototype.propertyIsEnumerable);
    const concat = Function.bind.call(Function.call, Array.prototype.concat);
    const keys = Reflect.ownKeys;
    
    if (!Object.values) {
    	Object.values = function values(O) {
    		return reduce(keys(O), (v, k) => concat(v, typeof k === 'string' && isEnumerable(O, k) ? [O[k]] : []), []);
    	};
    }
    
    // The actual code
    let self = {
      data: {
        CallsByDisposition: {
          a: 7,
          b: 30,
          c: null,
          d: 5
        }
      }
    };
    self.sum =
      Object.values(self.data.CallsByDisposition)
        .reduce((s, e) => s + parseInt(e || "0"));
    console.log("sum values: ", self.sum);

    1 使用parseInt 时,通常最好使用基数(第二个参数)。同样重要的是要记住它会很乐意忽略尾随的无效字符,例如parseInt("123abc", 10)123,而不是您所期望的 NaN

    另一种方法是使用Number("123")+"123"(它们做同样的事情)。这样做的好处是不会忽略无效的尾随字符(Number("123abc")NaN),但缺点是将 "" 视为 0

    所以你付了钱,然后你就可以选择了……

    【讨论】:

    • 呃,我讨厌在号码上打电话给parseInt。有龙。好吧,如果你的数字太高,但仍然如此。我宁愿做.map(Number).filter(x=>x),这只会留下有效的东西加在一起。
    • @vlaz:是的,我应该添加一条关于使用parseInt 的说明。但是在强制或Number 方法中也有龙:Number("")0
    • 这是真的,但在这种情况下并不重要 - .filter(x=>x) 将删除它们以及任何虚假的内容(这将只是 NaN),即使那样它们也不会影响总和值。
    • @vlaz:关键是他们都有龙。他们只是有不同的龙。
    • 什么龙?我不知道你们在说什么
    猜你喜欢
    • 1970-01-01
    • 2021-09-09
    • 2020-10-04
    • 2013-01-15
    • 2017-10-18
    • 2018-05-10
    • 2019-07-29
    • 1970-01-01
    相关资源
    最近更新 更多