【问题标题】:Create new array of objects if one key is same then add other key's value of those object如果一个键相同,则创建新的对象数组,然后添加这些对象的其他键的值
【发布时间】:2016-05-22 08:00:00
【问题描述】:

我想根据一个键过滤我的对象数组。如果该键在其他对象中相同,则将添加对象的第二个值。我有一个对象数组,如下所示:

输入:

var myArray = [
{
_name : "Mike",
_amount : "7"
},
{
_name : "Julius",
_amount : "10"
},
{
_name : "Edison",
_amount : "2"
},
{
_name : "Mike",
_amount : "10"
},
{
_name : "Kate",
_amount : "0"
},{
_name : "Edison",
_amount : "10"
}
]

输出:

var myNewArray = [
{
_name : "Mike",
_amount : "17"
},
{
_name : "Julius",
_amount : "10"
},
{
_name : "Edison",
_amount : "12"
},
{
_name : "Kate",
_amount : "0"
},
]

Mike 和 Edison 重复了两次,因此 _amount 键为这些对象添加了值。这对我来说有点混乱。请帮帮我。谢谢!

【问题讨论】:

  • 请编辑您的帖子,因为数组中的对象无效。对象字面量的结构是 { name: value } 用冒号代替等号。
  • @NinaScholz,感谢您的关注。我会更新的

标签: javascript jquery arrays object


【解决方案1】:

您可以使用Array#forEach 和一个对象作为插入对象的引用。

var myArray = [{ _name: "Mike", _amount: "7" }, { _name: "Julius", _amount: "10" }, { _name: "Edison", _amount: "2" }, { _name: "Mike", _amount: "10" }, { _name: "Kate", _amount: "0" }, { _name: "Edison", _amount: "10" }],
    newArray = [];

myArray.forEach(function (a) {
    if (!this[a._name]) {
        this[a._name] = { _name: a._name, _amount: 0 };
        newArray.push(this[a._name]);
    }
    this[a._name]._amount = (+this[a._name]._amount + +a._amount).toString(); // if you really
}, Object.create(null));                                                      // need strings

console.log(newArray);

按要求按_amount降序排序

var myArray = [{ _name: "Mike", _amount: "7" }, { _name: "Julius", _amount: "10" }, { _name: "Edison", _amount: "2" }, { _name: "Mike", _amount: "10" }, { _name: "Kate", _amount: "0" }, { _name: "Edison", _amount: "10" }],
    newArray = [];

myArray.forEach(function (a) {
    if (!this[a._name]) {
        this[a._name] = { _name: a._name, _amount: 0 };
        newArray.push(this[a._name]);
    }
    this[a._name]._amount += +a._amount
}, Object.create(null));

newArray.sort(function (a, b) {
    return b._amount - a._amount;
});

console.log(newArray);

【讨论】:

  • 只有一个字“棒极了”。非常感谢
  • 我们如何在这里根据_amount对newArray进行排序?
  • sort ..?根据属性,您需要为此回调。
  • 是的,基于 _amount 属性。您能否更新答案。谢谢
  • 谢谢妮娜。我是 JavaScript 新手,从昨天开始一直在苦苦挣扎。
【解决方案2】:

就 ES6 而言,这是这样做的。

var myArray = [
{
_name : "Mike",
_amount : "7"
},
{
_name : "Julius",
_amount : "10"
},
{
_name : "Edison",
_amount : "2"
},
{
_name : "Mike",
_amount : "10"
},
{
_name : "Kate",
_amount : "0"
},{
_name : "Edison",
_amount : "10"
}
],
result = myArray.reduce((p,c) => {var o = p.find(e => e._name == c._name);
                                  !!o ? o._amount = (o._amount*1+c._amount*1)+"" : p.push(c);
                                  return p;},[]).sort((a,b) => b._amount-a._amount);
console.log(result);

【讨论】:

    【解决方案3】:

    您希望使用的是存储键(名称)及其相应数量的映射。如果您再次遇到它,您可以添加相应数量的密钥。然后,您可以浏览地图并将对象添加到数组中。

    var myArray = [
    {
    _name:"Mike",
    _amount: 7
    },
    {
    _name:"Julius",
    _amount: 10
    },
    {
    _name:"Edison",
    _amount: 2
    },
    {
    _name:"Mike",
    _amount: 10
    },
    {
    _name:"Kate",
    _amount: 0
    },{
    _name:"Edison",
    _amount: 10
    }
    ];
    
    var map = {};
    
    for (var i = 0 ; i < myArray.length ; i++) {
        var key = myArray[i]['_name'];
        var amount = myArray[i]['_amount'];
        if (!map[key]) {
            map[key] = amount;
        } else {
            map[key] += amount;
        }
    }
    var outputArray = [];
    for (var key in map) {
        if (map.hasOwnProperty(key)) {
            outputArray.push({_name: key, _amount: map[key]});
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-10
      • 2017-07-04
      • 2018-03-10
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 2022-12-01
      相关资源
      最近更新 更多