当前位置: 首页 > 知识库问答 >
问题:

前端 - 一个对象数组,现在需要获取数组中键重复的元素,只要一组代表性的键,对于值的处理希望能够按照原来对应键来摆放?

潘楚
2023-09-21

现在:

data=[{label:'a',value:'1'},{label:'a',value:'2'},{label:'b',value:'1'},{label:'c',value:'1'},{label:'d',value:'1'},{label:'a',value:'3'},{label:'b',value:'2'},{label:'c',value:'2'},]

希望:

data=[{label:'a',value:[1,2,3]},{label:'b',value:[1,2]},{label:'c',value:[1,2]},{label:'d',value:[1,2]}]

共有3个答案

沈单弓
2023-09-21
const data = [  {label:'a',value:'1'},  {label:'a',value:'2'},  {label:'b',value:'1'},  {label:'c',value:'1'},  {label:'d',value:'1'},  {label:'a',value:'3'},  {label:'b',value:'2'},  {label:'c',value:'2'}]// 相对之前的没啥优点// 就用时间优化了一下写法,提高了一下复用const format = (list, idKey = 'label', merageKey = 'value') => {  let result = new Map()  list.map(item => {      let temp = result.get(item[idKey]) || {...item, [merageKey]: []};      result.set(item[idKey], {...temp, [merageKey]: [...temp[merageKey], item[merageKey]]})  })  return [...result.values()]}console.log(format(data))
靳涵亮
2023-09-21
const data = [{label:'a',value:'1'},{label:'a',value:'2'},{label:'b',value:'1'},{label:'c',value:'1'},{label:'d',value:'1'},{label:'a',value:'3'},{label:'b',value:'2'},{label:'c',value:'2'},]const newData = data.reduce((newArr, item) => {    const sameLabelItem = newArr.filter(_item => _item.label === item.label)[0] // 现在 newArr 中找有没有相同 label 的对象    if (sameLabelItem) { // 如果有相同 label 的对象,直接在这个相同label对象的 value 中 push item 的 value        sameLabelItem.value.push(item.value)    } else { // 如果没有,newArr 直接 push item        newArr.push({ label: item.label, value: [item.value] })    }    return newArr // 返回 newArr}, [])console.log(newData) // 你要的结果
巫马翰翮
2023-09-21

这个问题是关于如何从一个对象数组中提取出重复键对应的元素,并将其值合并成一个字符串,以逗号分隔。在处理这个问题时,我们可以使用一个字典来记录每个键对应的值列表,然后遍历这个字典,将每个列表合并成字符串。以下是实现这个功能的JavaScript代码:

function mergeValues(data) {  // 创建一个字典来存储每个键对应的值列表  let dictionary = {};  // 遍历数据,将每个键值对添加到字典中  for (let i = 0; i < data.length; i++) {    let { label, value } = data[i];    if (!dictionary[label]) {      dictionary[label] = [];    }    dictionary[label].push(value);  }  // 创建一个新的数组来存储结果  let result = [];  // 遍历字典,将每个键对应的值列表合并成字符串,并添加到结果数组中  for (let label in dictionary) {    let values = dictionary[label];    let mergedValues = values.join(',');    result.push({ label, value: mergedValues });  }  return result;}let data = [  {label:'a',value:'1'},  {label:'a',value:'2'},  {label:'b',value:'1'},  {label:'c',value:'1'},  {label:'d',value:'1'},  {label:'a',value:'3'},  {label:'b',value:'2'},  {label:'c',value:'2'},];let result = mergeValues(data);console.log(result);

当运行这段代码时,将会打印出:

[  { label: 'a', value: '1,2,3' },  { label: 'b', value: '1,2' },  { label: 'c', value: '1,2' },  { label: 'd', value: '1' }]

这正是你想要的结果。需要注意的是,如果一个键对应多个值,那么这些值将会合并成一个字符串,并以逗号分隔。而如果一个键只有一个值,那么这个值将会作为一个单独的字符串返回。

 类似资料:
  • 问题内容: 我想以jQuery或纯JavaScript的形式获取JavaScript对象的键作为数组。 有没有比这更详细的方法? 问题答案: 用途: 这是ES5的功能。这意味着它可以在所有现代浏览器中使用,但不能在旧版浏览器中使用。 ES5-shim有一个实现可以偷

  • 我的 json 对象中有一个键值对数组,需要根据键等于主机拉出一个设置值。 我无法基于位置进行匹配,因为它可能位于成对数组中的任何位置,而且数组的大小可能会有所不同。 我当前的 Jolt 规格看起来像,但它只是列出了每对: 当前输出为: 我希望的输出如下,注意到字段名称的更改: 我想知道我是否需要先做一个修改-覆盖-测试操作,然后再进行一次转换?

  • 问题内容: 假设您有一个非常简单的数据结构: …并且您想将其中一些存储在javascript变量中。如我所见,您有三个选择: 如果您要存储(或希望可能拥有)多个“价值”部分(例如,增加他们的年龄等),显然第二或第三种选择是可行的,因此,为了论证,让我们假设在此结构中再也不需要任何数据值了。您选择哪一个,为什么? 编辑 :该示例现在显示最常见的情况:非顺序ID。 问题答案: 每个解决方案都有其用例。

  • 问题内容: 我有以下数组: 结果: 现在如何显示具有重复值的键?在此函数不应返回([0],[9]),因为没有重复的值。 如何找到相同值的键,例如 对于“ 2011-06-25”,应返回[7],[8] 问题答案: 函数名称显然很长;) 现在$ dups将包含一个由重复值键控的多维数组,其中包含每个重复项的键,如果您将“ true”作为第二个参数发送,它将返回没有重复值的原始数组。 或者,您可以将原始

  • 如果一个键也包含在字符串数组中,如何通过一个键的值从对象数组中筛选出对象? 不筛选出所有具有包含在此arr中的名称的对象: 结果:

  • 我在开快车。js应用程序,有几个API将数据提供给下拉框。返回的数据格式为: 其中key是我的选项key,value是显示文本。这个数组的结构是固定的,我知道一个事实,我总是将key和value作为数组中每个对象的字段。 当我尝试验证提交的表单(额外的服务器端验证)时,我想交叉引用为字段提供的值与数组中“key”的所有值(blah、foo、bar、baz)。鉴于这将是一个经常使用的路由,我想避免每