Javascript 如何通过对象属性计算对象数组中唯一元素的数量?

Javascript 如何通过对象属性计算对象数组中唯一元素的数量?,javascript,typescript,ecmascript-6,Javascript,Typescript,Ecmascript 6,我有一个orders数组 orders = [ {table_id: 3, food_id: 5}, {table_id: 4, food_id: 2}, {table_id: 1, food_id: 6}, {table_id: 3, food_id: 4}, {table_id: 4, food_id: 6}, ]; 我想写一个函数来计算数组中唯一表id或唯一食物id的数量。例如 例如, 唯一表id的列表为1、3、4,总计3 独特的食品id的列表为2,4,5,6,总计4

我有一个
orders
数组

orders = [
  {table_id: 3, food_id: 5},
  {table_id: 4, food_id: 2},
  {table_id: 1, food_id: 6},
  {table_id: 3, food_id: 4},
  {table_id: 4, food_id: 6},
];
我想写一个函数来计算数组中唯一表id或唯一食物id的数量。例如

例如,
唯一表id的列表为
1、3、4
,总计
3

独特的食品id的列表为
2,4,5,6
,总计
4

如何执行此操作?

将值添加到a并获取大小


如果您需要es5解决方案,那么您可以自己实现一个set类。

类似的方法可能会奏效:

function countTableId(orders){
    // sets are, well, sets of unique items. no duplicates allowed
    let uniqueId = new Set();
    for(let ord of orders){
        uniqueId.add(ord.table_id);
    }
    // the size of the set is the number of unique items we added
    return uniqueId.size;
}
您可以在另一个函数中对food_id属性执行相同的操作

@费利克斯·金有一种单行其道的方法,所以给他一些道具。它使用set对象和Array.prototype.map()


.map()将在数组中循环并查看每个表的id,然后尝试将其添加到集合中。如果一个元素已经存在,set对象将丢弃它,因此我们只能得到唯一的值。最后,由于链接,我们可以得到集合的大小,我们就完成了

我很确定您还没有尝试过,因为它看起来很简单:

1-初始化数组 2-循环浏览订单并填充阵列 当然,你可以得到它们的长度:

unique_table_ids.length // = 3
unique_food_ids.length // = 4

您可以创建一个不同的表和食物ID的列表,同时对它们进行计数。此代码将创建2个保存信息的对象

var订单=[
{表id:3,食品id:5},
{表id:4,食品id:2},
{表id:1,食品id:6},
{表id:3,食品id:4},
{表id:4,食品id:6},
];
var表={};
var={};
对于(订单中的var i){
var订单=订单[i];
var tableId=“table\u id”+order.table\u id;
var foodId=“food\u id”+order.food\u id;
if(tables.hasOwnProperty(tableId)){
表[tableId]++;
}
否则{
表[tableId]=1;
}
if(食品。自有财产(食品){
食物[食物]+;
}
否则{
食物[foodId]=1;
}
}
控制台日志(表);
控制台日志(食品)您可以使用并映射所需的部分

var orders=[{table_id:3,food_id:5},{table_id:4,food_id:2},{table_id:1,food_id:6},{table_id:3,food_id:4},{table_id:4,food_id:6}],
getUnique=key=>[…新集合(orders.map(o=>o[key]))];
log(getUnique('table_id');
console.log(getUnique('food_id'))
。作为控制台包装{max height:100%!important;top:0;}
您可以组合并:

()

简单地说:

var results = {};

orders.forEach(function(item) {
  for (var key in item) {
    results[key] = results[key] || [];
    if (results[key].indexOf(item[key]) == -1)
      results[key].push(item[key]);
  }
})

for (var key in results) {
  console.log("The list of unique "+ key +" are "+ results[key] +" which totals "+ results[key].length);
}
行数不多,除了结果对象之外没有新的数据结构,没有对现有代码的编辑,并且,最重要的,没有对所需的订单对象键的预先了解

var订单=[
{表id:3,食品id:5},
{表id:4,食品id:2},
{表id:1,食品id:6},
{表id:3,食品id:4},
{表id:4,食品id:6},
{表id:4,食品id:6},
{表id:4,食品id:6}
];
var tableObj={},foodObj={};
orders.forEach(函数(e){
tableObj[e.table_id]=null;
foodObj[e.food_id]=null;
});
var tableUniqueIDs=Object.keys(tableObj);
var foodUniqueIDs=Object.keys(foodObj);
log(“表ID:”,tableUniqueID);
console.log(“食物ID:,foodUniqueIDs”)成功了

订单=[
{表id:3,食品id:5},
{表id:4,食品id:2},
{表id:1,食品id:6},
{表id:3,食品id:4},
{表id:4,食品id:6},
];
var结果=[];
var result2=[];
对于(var i=0;i
订单=[
{表id:3,食品id:5},
{表id:4,食品id:2},
{表id:1,食品id:6},
{表id:3,食品id:4},
{表id:4,食品id:6},
];
函数计数(arr,键){
res=[];
arr.map(obj=>obj[key])

.filter(n=>res.indexOf(n)表id 4是什么?为什么不计算它?还有,您到底尝试了什么。一种方法:
newset(orders.map(x=>x.table_id)).size
哇!最好的一行!谢谢@FelixKling@anonym,我在回答中加入了Felix Kings行,并解释了它的工作原理。值得注意的是,您不必检查集合是否已经有id,因为如果向集合中添加重复的值,集合将不会保留它们。因此,这就是@Felix Klings解决方案起作用的原因。为什么没有我想到了?非常感谢。
for (var i = 0; i < orders.length; i++) {
    if (unique_table_ids.indexOf(orders[i].table_id) == -1) // if this Table ID wasn't already in the unique table ID list
        unique_table_ids.push(orders[i].table_id);          // Add the table ID to the unique table ID list
    if (unique_food_ids.indexOf(orders[i].table_id) == -1)  // if this Food ID wasn't already in the unique food ID list
        unique_food_ids.push(orders[i].food_id);            // Add the food ID to the unique food ID list
}
unique_table_ids // = [3, 4, 1];
unique_food_ids // = [5, 2, 6, 4];
unique_table_ids.length // = 3
unique_food_ids.length // = 4
type Order = {
    table_id: number;
    food_id: number;
}

let orders = [
  {table_id: 3, food_id: 5},
  {table_id: 4, food_id: 2},
  {table_id: 1, food_id: 6},
  {table_id: 3, food_id: 4},
  {table_id: 4, food_id: 6},
] as Order[];

let uniques = orders.sort((a, b) => a.table_id - b.table_id)
    .filter((value, index, array) => index === array.length - 1 || array[index + 1].table_id !== value.table_id);

console.log(uniques.length); // 3
var results = {};

orders.forEach(function(item) {
  for (var key in item) {
    results[key] = results[key] || [];
    if (results[key].indexOf(item[key]) == -1)
      results[key].push(item[key]);
  }
})

for (var key in results) {
  console.log("The list of unique "+ key +" are "+ results[key] +" which totals "+ results[key].length);
}