从多维数组中删除数据

时间:2016-09-06 11:58:35

标签: javascript jquery arrays json

我有以下多维对象数组:

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");

1 个答案:

答案 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);