如何获取数组中唯一值的数量?

时间:2016-07-27 10:11:36

标签: javascript jquery arrays

我有一个从AJAX请求返回给我的JSON对象。我知道如何将属于数组/对象中的键的值的总和相加。但我怎么能动态地做到这一点?它可能非常简单,我只是忽略了这一点,我可以想象它涉及另一个阵列。 我使用的示例是从每个国家/地区获取总数,我已从示例中删除了无关信息。

{
"message": [
      {
        "login_country_name": "Great Britain"
      },
      {
        "login_country_name": "Great Britain"
      },
      {
        "login_country_name": "United States"
      },
      {
        "login_country_name": "Localhost"
      },
      {
        "login_country_name": "Netherlands"
      }
    ]
}

期望结果类似于:

("Great Britain": 2, "United States": 1, "Localhost": 1, "Netherlands": 1)

5 个答案:

答案 0 :(得分:4)

迭代数组并生成结果。您可以使用 Array#reduce 方法。

var data = {
  "message": [{
    "login_country_name": "Great Britain"
  }, {
    "login_country_name": "Great Britain"
  }, {
    "login_country_name": "United States"
  }, {
    "login_country_name": "Localhost"
  }, {
    "login_country_name": "Netherlands"
  }]
};

var res = data.message.reduce(function(obj, v) {
  // update country count , where `(obj[v.login_country_name] || 0)` helps to avoid undefined retrns `0` if undefined
  obj[v.login_country_name] = (obj[v.login_country_name] || 0) + 1;
  // return the updated object
  return obj;
  // set initial value as an object which stores the result
}, {})

console.log(res);

答案 1 :(得分:3)

您只需循环数据并计算每个唯一值的数量。

var d = {
  "message": [{
    "login_country_name": "Great Britain"
  }, {
    "login_country_name": "Great Britain"
  }, {
    "login_country_name": "United States"
  }, {
    "login_country_name": "Localhost"
  }, {
    "login_country_name": "Netherlands"
  }]
}
var r = {};

d.message.forEach(function(o){
  r[o.login_country_name] = (r[o.login_country_name] || 0) +1
});

console.log(r)

答案 2 :(得分:2)

您可以使用对象和国家/地区作为键。

var object = { "message": [{ "login_country_name": "Great Britain" }, { "login_country_name": "Great Britain" }, { "login_country_name": "United States" }, { "login_country_name": "Localhost" }, { "login_country_name": "Netherlands" }] },
    count = Object.create(null);

object.message.forEach(function (a) {
    count[a.login_country_name] = (count[a.login_country_name] || 0) + 1;
});

console.log(count);

答案 3 :(得分:0)

var obj = {
  "message": [{
    "login_country_name": "Great Britain"
  }, {
    "login_country_name": "Great Britain"
  }, {
    "login_country_name": "United States"
  }, {
    "login_country_name": "Localhost"
  }, {
    "login_country_name": "Netherlands"
  }]
}
var _getObj = obj.message;
var grouped=[];
_getObj.forEach(function(item) {
  if (!this[item["login_country_name"]]) { // if item dont exist then create a new
    this[item["login_country_name"]] = {

        name: item["login_country_name"],
        qty: 0
      };
      grouped.push(this[item["login_country_name"]])
  }
  this[item["login_country_name"]].qty = this[item["login_country_name"]].qty + 1;


}, Object.create(null)) // create an empty object
console.log(grouped)

JSFIDDLE

答案 4 :(得分:0)

这是你需要的吗?

var message = [
  {
    "login_country_name": "Great Britain"
  },
  {
    "login_country_name": "Great Britain"
  },
  {
    "login_country_name": "United States"
  },
  {
    "login_country_name": "Localhost"
  },
  {
    "login_country_name": "Netherlands"
  },
  {
    "login_country_name": "Great Britain"
  }
];

var newMessage = [];
$.each(message, function(key, value) {
  if (newMessage.length < 1) {
    newMessage.push(value);
    
  } else {
    var dIndex = -1;
    $.each(newMessage, function(idx, val) {
      if (value.login_country_name === val.login_country_name) dIndex = idx;
    });
   
    if (dIndex == -1) {
      value.count = 1;
      newMessage.push(value);
    } else {
      newMessage[dIndex].count = (newMessage[dIndex].count || 1) + 1;
    }      
  }
});

console.log(newMessage);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>