我有以下多维对象数组:
var data ='{
"Form": [],
"Report": [],
"Misc": [],
"Test5": [],
"Test4": [],
"Provider": [
{ "Memorial Hospital": ["img0.jpg"] },
{ "Cooper Memorial Hospital": [
"img1.jpg",
{ "Emergency Reports": ["img2.jpg"] },
{ "Diagnostic Reports": [
"img3.jpg",
{
"12/12/2006": ["img4.jpg", "img5.jpg"],
"03/13/2009": ["img6.jpg", "img7.jpg"]
}
]},
{ "Accident Reports": ["img8.jpg"] },
{ "Other Reports": ["img9.jpg", "img10.jpg"] }
]}
]
}';
我想从img7.jpg
"03/13/2009"
数组中删除数据
我的工作是:
var obj = JSON.parse(data);
console.log(obj['Provider'][1]["Cooper Memorial Hospital"][2]["Diagnostic reports"][0]["12/12/2006"]).splice(0,1);
这一切都有效,现在当我从“Cooper Memorial Hospital”添加/删除数组时出现问题。指数得到重述。
所以我想用索引拼接,有什么方法可以从img3.jpg调用的数组和子数组中删除img:
removeImg("img3.jpg", obj['Provider']);
像这样。
更新: 我尝试使用此代码,但它需要一些额外的代码来循环子数组:
function remove(arr, what) {
var found = arr.indexOf(what);
while (found !== -1) {
arr.splice(found, 1);
found = arr.indexOf(what);
if(found)
break;
}
}
remove(a,"img1");
答案 0 :(得分:0)
我的第一直觉是尝试修复此服务器端,因为数据格式看起来有点奇怪的嵌套。
要修复客户端,您需要编写一个递归函数,检查字符串的所有嵌套数组并在运行中删除它。
首先,从数组中删除项目的代码:
var removeStringFromArray = function(str, array) {
var index = array.indexOf(str);
if (index !== -1) {
array.splice(index, 1);
}
};
这会动态查找字符串的索引并拼接它。 请注意,这会改变您的数组。
要查看对象中的所有项目,我们将使用此代码段:
Object.keys(obj).forEach(function(key) {
var value = obj[key];
// Do something with value...
});
这将获取一组键并循环其值。如果这两个片段看起来没问题,你可以将它们组合在递归函数中,就像我在下面的例子中所做的那样。我还没有针对性能或代码行进行优化;我试着让它变得可读。另请注意,我正在使用Array.isArray
和快速而谨慎的isPrimitive
支票。
var removeStringFromArray = function(str, array) {
var index = array.indexOf(str);
if (index !== -1) {
array.splice(index, 1);
}
};
var removeStringFromArraysInVariable = function(str, val) {
if (isPrimitive(val)) {
// Don't do anything for falsy, bools, strings, numbers
return;
}
// For an array
if (Array.isArray(val)) {
// Remove all strings first
removeStringFromArray(str, val);
// Call method recursively for any non string values that might be there
val.forEach(function(innerVal) {
removeStringFromArraysInVariable(str, innerVal);
});
return;
}
// If we get here, it's probably an object
Object.keys(val).forEach(function(key) {
// Call recursively for each property value
removeStringFromArraysInVariable(str, val[key]);
});
};
// You might want to look up if this is a fool proof way to check for primitives
var isPrimitive = function(val) {
if (!val) return true;
var constr = (val).constructor;
return (
constr === Number ||
constr === Boolean ||
constr === String);
}
// Test data
var data = {
"Form": [],
"Report": [],
"Misc": [],
"Test5": [],
"Test4": [],
"Provider": [{
"Memorial Hospital": ["img0.jpg"]
}, {
"Cooper Memorial Hospital": [
"img1.jpg", {
"Emergency Reports": ["img2.jpg"]
}, {
"Diagnostic Reports": [
"img3.jpg", {
"12/12/2006": ["img4.jpg", "img5.jpg"],
"03/13/2009": ["img6.jpg", "img7.jpg"]
}
]
}, {
"Accident Reports": ["img8.jpg"]
}, {
"Other Reports": ["img9.jpg", "img10.jpg"]
}
]
}]
};
removeStringFromArraysInVariable("img3.jpg", data);
console.log(data);