【问题标题】:How to remove the duplicate values from the Object如何从对象中删除重复值
【发布时间】:2019-02-07 04:58:20
【问题描述】:

我在下面有一个对象。

object1 = {name: "tony, tony", city: "Reno, Reno", country: "Canada, Canada"}

我想去掉object1中的重复值,返回如下。

 filteredObject = {name: "tony",city: "Reno", country: "Canada"}

有什么好的方法可以实现吗?

【问题讨论】:

  • 当然有可能,但我想知道你从哪里得到原始对象?如果可能,您应该首先修复导致 object1 看起来像这样的原因。
  • 你是对的。我应该这样做。

标签: javascript object filter


【解决方案1】:

您可以使用for..in 循环来遍历对象。然后 split() 每个值并使用 SetSpread Synataxjoin()

删除重复项

const obj = object1 = {name: "tony, tony", city: "Reno, Reno", country: "Canada, Canada"};
const filteredObj ={};
for(let key in obj){
	filteredObj[key] = [... new Set(obj[key].split(', '))].join(', ');
}
console.log(filteredObj)

【讨论】:

  • 谢谢。这对我来说很新,仍然试图理解它背后的登录。它有效。
【解决方案2】:

说明

您可以使用mapreduce 函数来操作您的对象键。为了删除重复项,您可以使用 临时字典 来保存您的密钥。可以使用str.split(', ') 找到字符串中的各个值。它看起来像这样

代码

// Reno, Reno, Toronto => Reno, Toronto    
const removeDupsFromString = (s) => {
  const dict = s.split(', ').reduce((acc, curr) => {
    acc[curr] = true;
    return acc;
  }, {});

  return Object.keys(dict).join(', ');
}

const removeDupsFromObject = (obj) => Object.keys(obj).reduce((acc, key) => {
  acc[key] = removeDupsFromString(obj[key]);
  return acc;
}, {});

const obj = {
  name: "Tony, Tony, Stark",
  city: "Reno, Reno",
  country: "Canada, Canada"
};

console.log(removeDupsFromObject(obj));

注意

这并不能保持单词的顺序,Tony, Tony, Stark 可能会产生Tony, StarkStark, Tony,因为它使用Object.keys

【讨论】:

  • 这适用于 OPs 示例,但对于您的示例,它将不确定地返回 'Tony, Stark''Stark, Tony' 的名称,因为它使用对象并且对象键是无序的。 Object.keys 可能不会按照字符串中遇到的顺序返回它们。
  • 是的,你是对的,它不会保留单词的顺序。我在答案中包含了您的注释
  • 感谢您的详细解释。
【解决方案3】:

使用object.keysforEachSet

let object1 = {name: "tony, tony, stark, start, stark", city: "Reno, Reno", country: "Canada, Canada"}

let filteredObject = {}

Object.keys(object1).forEach(e=>{
  filteredObject[e] = [...new Set(object1[e].split(', '))].join(', ')
})


console.log(filteredObject)

【讨论】:

  • 这不会删除重复项。它只得到第一个单词。 tony, hello即使没有重复也会转化为“tony”
  • @molamk 感谢您的指出。添加集合以回答处理重复项
  • 谢谢。我现在正在尝试这个,它可以工作。
【解决方案4】:

您可以使用Array#reduce 来累积从对象值中删除重复条目后的结果。

Object#entries 将对象中的 [key,value] 对作为数组给出。

reduce 将作用于该数组并通过仅获取唯一值将其累积到一个新对象中。 replace(/\s+/g, '') 将删除所有空格,否则该集合不会将单词视为唯一的(考虑空格可能在逗号“,”之前或之后的情况)。

const object1 = {name: "tony, tony", city: "Reno, Reno", country: "Canada, Canada", foo: "foo, foo, bar", baz: "baz ,bar ,bar"};
//Notice the last entry in this object where space is before the comma
const obj = Object.entries(object1).reduce((acc, ele) => {
   acc[ele[0]] = [...new Set(ele[1].replace(/\s+/g, '').split(","))].join(",");
  return acc;
}, {});
console.log(obj);

【讨论】:

  • 这不会像 OP 要求的那样删除重复项。它只得到第一个单词
  • @molamk 对,很好的观察。我对其进行了编辑,使其仅包含独特的元素。
  • 谢谢。其实这真的很有帮助。它奏效了。
猜你喜欢
  • 2014-10-11
  • 2020-07-22
  • 2018-05-27
  • 1970-01-01
  • 2014-08-23
  • 2015-08-25
  • 2022-12-05
  • 2019-12-12
  • 2023-01-10
相关资源
最近更新 更多