如何使用逗号分隔来获取具有相同键值的对象

时间:2016-07-18 13:06:58

标签: javascript jquery angularjs

我有一个对象数组,每个对象都有键和值。我希望如果对象具有相同的键,那么它们的值应该以逗号分隔相同键的所有值。 我的HTML代码:

<p ng-repeat="item in allOptions" class="item" id="{{item.id}}">
  {{item.id}} <input type="checkbox" ng-change="sync(bool, item)" ng-model="bool" >  {{item}} Selected: {{bool}} 
  </p>

我的控制器代码是:

 $scope.allOptions = [
    {
      "id": "1",
      "data": "one",
    },
    {
      "id": "1",
      "data": "two",
    },
    {
      "id": "2",
      "data": "three",
    },
  ];

  $scope.data = [

  ];

  $scope.sync = function(bool, item){

    if(bool){
      // add item
      $scope.data.push(item);
    } else {
      // remove item
      for(var i=0 ; i < $scope.data.length; i++) {
        if($scope.data[i] == item.id){
          $scope.data.splice(i,1);
        }
      }      
    }
  };

在数据数组中我有对象,如果我们选择相同的对象键(相同的id值),那么我想要

{
          "id": "1",
          "data": "one","two",
        }

4 个答案:

答案 0 :(得分:1)

var myData = [{
      "id": "1",
      "data": "one",
    },{
      "id": "1",
      "data": "two",
    },{
      "id": "2",
      "data": "three",
    }];

var output = [];

//Iterating each element of the myData
myData.forEach(o => {

  //Checking the duplicate value and updating the data field
  let temp = output.find(x => { 
      if (x && x.id === o.id) {
        x.data += ", " + o.data;
        return true;
    }
  });
  if(!temp)
     output.push(o);
     
});
console.log(output);

答案 1 :(得分:0)

您可以通过以下方式执行此操作:

function filterData(collection) {
            var hash = {};
            var result = [];
            collection.forEach(function (item) {
                if (hash[item.id]) {
                    hash[item.id].data += ', ' + item.data;
                }
                else {
                    hash[item.id] = item;
                }
            });
            for (var i in hash) {
                result.push(hash[i]);
            }
            return result;
        }

&#13;
&#13;
var myData = [
    {
      "id": "1",
      "data": "one",
    },
    {
      "id": "1",
      "data": "two",
    },
    {
      "id": "2",
      "data": "three",
    },
  ]; // this will be your input data

function filterData(collection) {
                var hash = {};
                var result = [];
                collection.forEach(function (item) {
                    if (hash[item.id]) {
                        hash[item.id].data += ', ' + item.data;
                    }
                    else {
                        hash[item.id] = item;
                    }
                });
                for (var i in hash) {
                    result.push(hash[i]);
                }
                return result;
            }
                                       
var filteredData = filterData(myData);  //your filtered data
&#13;
&#13;
&#13;

答案 2 :(得分:0)

我认为,最简单的方法就是:

z = [
      {
        "id": "1",
        "data": "one",
      },
      {
        "id": "1",
        "data": "two",
      },
      {
        "id": "2",
        "data": "three",
      },
   ];


即时代码:

var result = {};
var groupedO = {};
for(a in z){
  var id = z[a].id;
  var data = z[a].data;
  if(groupedO[id] && groupedO[id].data){
    groupedO[id].data = groupedO[id].data + ',' + data;
  } else {
    groupedO[id] = {data:data};
  }
}
for(ind in groupedO) {
  var el = groupedO[ind];
  if(el.data.split(',').length > 1) { // here we take only last those, where many datas grouped in
    result.id = ind;
    result.data = el.data;
  }
}


在此之后,result将如下所示:

 { id: "1", data: "one,two" }

答案 3 :(得分:0)

如果你使用jQuery,那么你可以在这段代码中使用$.extend()函数,如果你不想在数组 hash <中引用对象 item / strong>即可。这意味着如果您更改数组哈希中的对象,则数组 myData 中的对象也会更改。为避免这种情况,请使用$.extend()函数。

&#13;
&#13;
var myData = [
    {
      "id": "1",
      "data": "one",
    },
    {
      "id": "1",
      "data": "two",
    },
    {
      "id": "2",
      "data": "three",
    },
]; // this will be your input data

function filterData(collection) {
    var hash = {};
    var result = [];
    collection.forEach(function (item) {
        if (hash[item.id]) {
            hash[item.id].data += ', ' + item.data;
        }
        else {
            hash[item.id] =  $.extend({}, item);
        }
    });
    for (var i in hash) {
        result.push(hash[i]);
    }
    return result;
}
                                       
var filteredData = filterData(myData);  //your filtered data
&#13;
&#13;
&#13;