Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将具有重复键的对象转换为JSON/String?_Javascript_Object_Duplicates_Key - Fatal编程技术网

Javascript 如何将具有重复键的对象转换为JSON/String?

Javascript 如何将具有重复键的对象转换为JSON/String?,javascript,object,duplicates,key,Javascript,Object,Duplicates,Key,想象你有一个这样的物体: 使用JSON.stringify(obj)将其转换为JSON会产生: 这会导致数据丢失,这不是我们想要的 使用toString()将其转换为字符串 [对象对象] ,这也不是我们想要的 这件事怎么办 PS:我知道对象不能有两个相同的键 所以,在与这里发表评论的优秀用户进行了一些头脑风暴之后,一个简单的方法就是手动将其转换为字符串。像这样: var obj = ` name: "Mike", name: "George", age: 24,

想象你有一个这样的物体:



使用
JSON.stringify(obj)
将其转换为JSON会产生:


这会导致数据丢失,这不是我们想要的

使用
toString()
将其转换为字符串
[对象对象]
,这也不是我们想要的

这件事怎么办


PS:我知道对象不能有两个相同的键



所以,在与这里发表评论的优秀用户进行了一些头脑风暴之后,一个简单的方法就是手动将其转换为字符串。像这样:

var obj = `
    name: "Mike",
    name: "George",
    age: 24,
`;
var obj = `
    name: "Mike",
    name: "George",
    age: 24,
`;
然后把它解析成你心中的内容。对我个人来说,这可能是一种方法。然而,这显然取决于用户情况

var obj2 = {};
str = str.split(",").map(e => e.replace(/(\")/gi, "").trim());

str.forEach((e, i) => {
  var temp = e.slice(0, e.indexOf(":"));
  if(obj2[temp]) obj2[temp].push(e.slice(e.indexOf(":") + 1).trim());
  else obj2[e.slice(0, e.indexOf(":"))] = [e.slice(e.indexOf(":") + 1).trim()];
})
var obj2 = {};
str = str.split(",").map(e => e.replace(/(\")/gi, "").trim());

str.forEach((e, i) => {
  var temp = e.slice(0, e.indexOf(":"));
  if(obj2[temp]) obj2[temp].push(e.slice(e.indexOf(":") + 1).trim());
  else obj2[e.slice(0, e.indexOf(":"))] = [e.slice(e.indexOf(":") + 1).trim()];
})
上面的代码只是根据所需的分隔符拆分字符串,并进一步处理给定数组。这可能是解决问题的一种不礼貌的方式,但它适用于我的场景:/。它生成以下JSON对象:

{"name":["Mike","George"],"age":["24"]}


你不能这么做。
“name”
值是分配给javascript对象或JSON中的
“name”
键的第二个值。尝试使用
obj.name
它将是
“George”

这是解决您需要的问题的方法。您可以使用
“\u”
或任何未使用的符号

const obj = {
  name: 'ahmed',
  _name: 'elmetwally',
  title: 'js dev',
};

console.log(JSON.stringify(obj).replace(/\_/g, ''));


在定义对象之后,第二个“name”键将覆盖第一个“name”键

可以按如下方式重新构造对象:

var obj = {
    name: ["Mike","George"],
    age: 24,
}

并使用js中字符串的内置函数来获得预期结果


希望这有帮助

下面是一个简单的方法,可以将对象的字符串表示形式转换为键值对数组

这不是一个通用的方法,但对于没有嵌套的对象,它应该可以很好地工作

let result=document.getElementById('result');
让jsonStr=`{name:“Mike”,name:“George”,年龄:24}`;
result.innerHTML=`jsonStr:${jsonStr}'\n`;
//去掉“{}”
让jsonClean=jsonStr.replace(/{/g',).replace(/}/g',);
result.innerHTML+=`jsonClean:${jsonClean}\n`;
//将jsonClean拆分为键值字符串数组
让kvStrings=jsonClean.split(',');
result.innerHTML+=
`kvStrings:${JSON.stringify(kvStrings)}\n`;
//形成键值对数组
让kvPairs=kvStrings.map(kvstr=>{
let[key,value]=kvstr.split(“:”).map(el=>el.trim());
//去掉双引号或转换为数字
if(value.includes(“”)){
值=值。替换(/“/g'”);
}否则{
value=Number.parseFloat(值);
}
返回[键,值];
});
result.innerHTML+=`kvPairs:${JSON.stringify(kvPairs)}`

因此,在与发表评论的优秀用户进行头脑风暴后,一个简单的方法是手动将其转换为字符串。像这样:

var obj = `
    name: "Mike",
    name: "George",
    age: 24,
`;
var obj = `
    name: "Mike",
    name: "George",
    age: 24,
`;
然后把它解析成你心中的内容。对我个人来说,这可能是一种方法。然而,这显然取决于用户情况

var obj2 = {};
str = str.split(",").map(e => e.replace(/(\")/gi, "").trim());

str.forEach((e, i) => {
  var temp = e.slice(0, e.indexOf(":"));
  if(obj2[temp]) obj2[temp].push(e.slice(e.indexOf(":") + 1).trim());
  else obj2[e.slice(0, e.indexOf(":"))] = [e.slice(e.indexOf(":") + 1).trim()];
})
var obj2 = {};
str = str.split(",").map(e => e.replace(/(\")/gi, "").trim());

str.forEach((e, i) => {
  var temp = e.slice(0, e.indexOf(":"));
  if(obj2[temp]) obj2[temp].push(e.slice(e.indexOf(":") + 1).trim());
  else obj2[e.slice(0, e.indexOf(":"))] = [e.slice(e.indexOf(":") + 1).trim()];
})
上面的代码只是根据所需的分隔符拆分字符串,并进一步处理给定数组。这可能是解决问题的一种不礼貌的方式,但它适用于我的场景:/。它生成以下JSON对象:

{"name":["Mike","George"],"age":["24"]}

在您声明对象的那一刻,第二个
名称
覆盖第一个,与
JSON
converting无关。是的,我知道这一点:)也许一种方法是将其转换为txt文件或其他什么?是的,我知道这一点。但是,除了手动更改键之外,是否真的没有其他方法将值保留在相同的键中?我更新了代码。但如果你能做到的话。如何再次解析字符串。很好,但它仍然不能解决任何问题。你看,这件大东西是别人给我的。它有1000个键,其中1000个键是重复键,但它们的值不同。我想保留所有的值,但如果是重复的,只需将它们重新分配给另一个键即可/实际上没有人能为你提供js对象有1000个重复密钥。问题中的obj变量有两个键,而不是三个键。请向我提供具有重复键的对象(可访问),我将创建具有重复键的genrate JSON函数。感谢回复。我知道这是可以做到的。然而,想象一下有人给你提供了这样一个对象。该对象有10000个关键点,假设有1000个重复的关键点。你不想丢失任何数据。您也希望保留重复键中的所有值,但如果是重复键,则将它们重新分配给一个新的但不同的键。嗯,如果输入是object,则无法保留对象而不丢失。当我想到数据时,您可以尝试使用另一种类型来存储数据,处理这种情况的一种方法是在整个对象周围加上引号,然后手动解析它/无论何时数据进入对象,它都将被覆盖:)不取决于解析前或解析后。。。。