循环遍历 JSON,在对象之间插入键/值
Loop Through JSON, Insert Key/Value Between Objects?
UPDATE - 感谢所有精彩的答案和令人难以置信的快速响应。 我从建议的解决方案中学到了很多东西。 我最终选择了我所做的答案,因为结果与我所要求的完全一样,并且我能够以最小的努力让它在我的应用程序中工作 - 包括搜索功能。 该网站是开发人员的宝贵资源。
可能是一项简单的任务,但我似乎无法让它工作,也无法在 Google 上找到任何东西。 我是一个Javascript新手,复杂的JSON让我感到困惑。 我想做的是为我们公司制作一个PhoneGap应用程序(电话簿)。 我将尝试在下面解释我的推理并说明我的尝试。
我有以下格式的所有员工的 JSON 数据:
[
{
"id":"1",
"firstname":"John",
"lastname":"Apple",
"jobtitle":"Engineer"
},
{
"id":"2",
"firstname":"Mark",
"lastname":"Banana",
"jobtitle":"Artist"
},
... and so on
]
我正在使用的移动框架(框架 7)提供了一个"虚拟列表"解决方案,我需要利用它,因为我们的目录相当大。 虚拟列表要求您知道每个列表项的确切高度,但是,您可以使用函数来设置动态高度。
我正在尝试做的是根据他们的姓氏为按字母顺序排列的列表创建"标题"。 JSON 数据必须按以下方式重组:
[
{
"title":"A"
},
{
"id":"1",
"firstname":"John",
"lastname":"Apple",
"jobtitle":"Engineer"
},
{
"title":"B"
},
{
"id":"2",
"firstname":"Mark",
"lastname":"Banana",
"jobtitle":"Artist"
},
... and so on
]
我已经能够使用 for 循环向数据中的现有对象添加键/值对:
var letter, newLetter;
for(var i = 0; i < data.length; i++) {
newLetter = data[i].lastname.charAt(0);
if(letter != newLetter) {
letter = newLetter
data[i].title = letter;
}
}
此解决方案更改 JSON,从而输出连接到列表项的标题栏(虚拟列表仅接受一个<li></li>
因此标题栏是该栏中的div):
{
"id":"1",
"firstname":"John",
"lastname":"Apple",
"jobtitle":"Engineer",
"title":"A"
},
{
"id":"1",
"firstname":"Mike",
"lastname":"Apricot",
"jobtitle":"Engineer",
"title":""
}
这个解决方案一直有效,直到我尝试为列表实现搜索功能。 当我搜索时,它按预期工作,但看起来很坏,因为标题标题("A"、"B"等)连接到开始特定字母部分的列表项。 出于这个原因,我需要能够将标题与现有元素分开,并将它们用于动态高度/从搜索结果中排除。
问题:如何执行在新字母分组的开头插入 [前置] NEW 对象(标题:字母)的 for 循环? 如果有更好的方法,请开导我。 正如我所提到的,我是一个JS新手,我很想成为更高效的编程Web应用程序。
var items = [
{ "lastname":"Apple" },
{ "lastname":"Banana" },
{ "lastname":"Box" },
{ "lastname":"Bump" },
{ "lastname":"Can" },
{ "lastname":"Switch" }
];
var lastC = null; //holds current title
var updated = []; //where the updated array will live
for( var i=0;i<items.length;i++) {
var val = items[i]; //get current item
var firstLetter = val.lastname.substr(0,1); //grab first letter
if (firstLetter!==lastC) { //if current title does not match first letter than add new title
updated.push({title:firstLetter}); //push title
lastC = firstLetter; //update heading
}
updated.push(val); //push current index
}
console.log(updated);
现在你有一个对象数组 - 将标题前缀为它自己的对象可能有点混乱 - 更好的结构可能是:
[
{
title: "A",
contacts: [
{
"id":"1",
"firstname":"John",
"lastname":"Apple",
"jobtitle":"Engineer",
"title":"A"
}
]
给定您当前的结构,您可以循环和推送:
var nameIndexMap = {};
var newContactStructure = [];
for (var i = 0; i < data.length; i++) {
var letter = data[i].lastname.charAt(0);
if (nameIndexMap.hasOwnProperty(letter)) {
//push to existing
newContactStructure[nameIndexMap[letter]].contacts.push(data[i])
} else {
//Create new
nameIndexMap[letter] = newContactStructure.length;
newContactStructure.push({
title: letter,
contacts: [
data[i]
]
});
}
}
newContactStructure
现在将包含已排序的数据。
演示:http://jsfiddle.net/7s50k104/
带有Array.prototype.splice
的简单for
循环将解决问题:
for (var i = 0; i < data.length; i++) {
if (i == 0 || data[i-1].lastname[0] !== data[i].lastname[0]) {
data.splice(i, 0, {title: data[i].lastname[0]});
i++;
}
}
演示。查看下面的演示。
var data = [
{"lastname":"Apple"},
{"lastname":"Banana"},
{"lastname":"Bob"},
{"lastname":"Car"},
{"lastname":"Christ"},
{"lastname":"Dart"},
{"lastname":"Dog"}
];
for (var i = 0; i < data.length; i++) {
if (i == 0 || data[i-1].lastname[0] !== data[i].lastname[0]) {
data.splice(i, 0, {title: data[i].lastname[0]});
i++;
}
}
alert(JSON.stringify( data, null, 4 ));
- 在帖子的网格循环之间插入Javascript(Adsense)
- 在数组中的偶数之间插入连字符
- jquery多次在元素之间插入html
- 插入键=>来自提交的Javascript对象的PHP中的值对
- 当数据库值为 NULL 时,如何在 XML 标记之间插入空格
- 单击时在文本之间插入图像节点
- 如何使用javascript在文本之间插入图像节点
- 使用 JavaScript 如何在行的现有
之间插入空白 标签 - 使用 javascript 在两个列表项之间插入下拉项
- 在两个 HTML 注释行之间插入内容
- 如何在两个连续的图像之间插入黑色空格
- 循环遍历 JSON,在对象之间插入键/值
- 如何在数组的元素之间插入空格,该数组作为 HTML 表单的输入读取
- 在数组中插入键和对象
- REGEX-在html注释模式之间插入内容
- 使用jQuery在祖先和后代之间插入元素
- 在wordpress网站的帖子之间插入谷歌广告,并进行无限滚动
- Json-在数组元素之间插入一个新对象
- 通过在相乘的成员之间插入*使数学方程字符串有效
- 在summernote上传的图片之间插入br标签