想要从数组中查找唯一和重复对象的数量,并以特定方式列出它们

Want to find the amount of unique and duplicate objects from an array and list them in a specific way

提问人:Ladizi 提问时间:10/18/2023 最后编辑:Ladizi 更新时间:10/18/2023 访问量:77

问:

[
 { "id":5,
  "name": "banana"
 },
 { "id":5,
  "name": "banana"
 },
 { "id":4,
  "name": "apple"
 },
 { "id":1,
  "name": "strawberry"
 },
 { "id":1,
  "name": "strawberry"
 }
]

const arrayMap = new Map(Array.map(i => [i.id, {...i, amount: 0 }]));

我只考虑过一种方法,例如映射数组并使用循环为每个对象分配数量,但我不确定这是否是一种好方法,而且字符串部分仍然是我无法弄清楚的。

订单将按最高 ID 号排序。该数组可以被看作是一个购物车,你可以有多个香蕉,它们只是列在字符串的同一部分下。

如果您有 2 个 ID 为 5 的香蕉、1 个 ID 为 4 的苹果和 2 个 ID 为 1 的草莓,它将显示如下:

然而,在我的例子中,“香蕉”并不是它的独特之处,而是 ID。不会有其他具有不同 ID 的香蕉,它们都将使用相同的 ID 添加为重复对象。

"2x Banana, 1x Apple, 2x Strawberry"

JavaScript 节点 .js 数组

评论

1赞 Vaibhav 10/18/2023
你尝试过什么吗?
0赞 Phil 10/18/2023
什么决定了结果的顺序?
0赞 Phil 10/18/2023
代码进入你的问题,而不是评论。请编辑
1赞 Phil 10/18/2023
但是,如果相同的值不同,会发生什么?请编辑您的问题,详细说明订购标准,并举例说明不同的输入和输出nameid
1赞 Phil 10/18/2023
如果有 2 根 ID 为 5 的香蕉和 1 根 ID 为 3 的香蕉会怎样?

答:

0赞 FatalError 10/18/2023 #1

你可以通过遍历数组来做到这一点。例如

const data = [
  { "id": 1, "name": "item1" },
  { "id": 2, "name": "item1" },
  { "id": 3, "name": "item3" },
  { "id": 4, "name": "xd" }
];

// Create an object to store item counts
const itemCounts = {};

data.forEach((item) => {
  const itemName = item.name;
  itemCounts[itemName] = (itemCounts[itemName] || 0) + 1;
});

const sortedItems = Object.entries(itemCounts)
  .sort((a, b) => b[1] - a[1])
  .map(([itemName, count]) => `${count}x ${itemName}`)
  .join(' ');

console.log(resultString); 
0赞 Phil 10/18/2023 #2
  1. 按 ID 从高到低对数组进行排序
  2. 将排序后的数组简化为以 with 和 values 为键的对象。名称冲突(如果有)可以通过先见解决。idnamecount
  3. 将这些条目映射到字符串,然后将整个内容连接在一起

const data = [{"id":5,"name":"banana"},{"id":5,"name":"banana"},{"id":4,"name":"apple"},{"id":1,"name":"strawberry"},{"id":1,"name":"strawberry"}];

const capitalise = (str) => str.replace(/\b[a-z]/g, (c) => c.toUpperCase());

const counts = data
  .toSorted((a, b) => b.id - a.id) // sort by ID highest to lowest
  .reduce((acc, { id, name }) => {
    acc[id] ??= {
      name,
      count: 0,
    };
    acc[id].count++;
    return acc;
  }, {});

const str = Object.values(counts)
  .map(({ name, count }) => `${count}x ${capitalise(name)}`)
  .join(", ");

console.log(str);


如果 Array.prototype.toSorted() 不可用,您可以

  • 不关心改变原始数组的顺序,只需使用Array.prototype.sort()
  • 使用 either 中断原始数组引用,然后使用[...data]data.slice(0).sort()

评论

0赞 Ladizi 10/18/2023
我错过了这是一个 node.js 项目的标签,所以 .toSorted() 不是一个选项。对于混乱,我深表歉意,这是我第一次访问这个网站。
0赞 Phil 10/18/2023
@Ladizi在 Node.js 20.0.0 中可用Array.prototype.toSorted()
0赞 Ladizi 10/18/2023
你提醒我更新 Node.js。对不起,又来了..哈哈
0赞 Phil 10/18/2023
@Ladizi如果您无法升级 Node,我添加了选项.js
0赞 Mahadev Mirasdar 10/18/2023 #3

let data = [{
    "id": 5,
    "name": "banana"
  },
  {
    "id": 5,
    "name": "banana"
  },
  {
    "id": 4,
    "name": "apple"
  },
  {
    "id": 1,
    "name": "strawberry"
  },
  {
    "id": 1,
    "name": "strawberry"
  }
];

let obj = {};

function findDuplicate(data) {
  data.map((e, i) => {
    let {
      id,
      name
    } = e;
    let val = 0;
    if ([name] in obj) {
      obj[name] = obj[name] + 1;
    } else {
      obj[name] = 1
    }
  })
  let output = '';
  let arr = Object.keys(obj);
  for (let x in obj) {
    if (arr.slice(-1) == x) {
      output += `${obj[x]}x ${x.charAt(0).toUpperCase() + x.slice(1)}`
    } else {
      output += `${obj[x]}x ${x.charAt(0).toUpperCase() + x.slice(1)}, `;
    }
  }
  return output;
}
console.log(findDuplicate(data));