Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.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 使用angularjs从json文件中删除项_Javascript_Angularjs_Json - Fatal编程技术网

Javascript 使用angularjs从json文件中删除项

Javascript 使用angularjs从json文件中删除项,javascript,angularjs,json,Javascript,Angularjs,Json,尝试从Json文件中删除项目时,我浪费了很多时间 这是我的json文件 { "count": 3, "data": [ { "id": "1", "raison": "ABS", "email": "abs@abs.com", "tel": "021269999999" }, { "id": "3", "raison": "PODL", "email": "abs@abs.com

尝试从Json文件中删除项目时,我浪费了很多时间

这是我的json文件

 {
  "count": 3,
  "data": [
    {
      "id": "1",
      "raison": "ABS",
      "email": "abs@abs.com",
      "tel": "021269999999"
    },
    {
      "id": "3",
      "raison": "PODL",
      "email": "abs@abs.com",
      "tel": "021269999999"
    }, {
      "id": "5",
      "raison": "dDMS",
      "email": "abs@abs.com",
      "tel": "021269999999"
    }
  ]
}
在控制器中,我有这样的

 $scope.deleteRow = function() {
  var _id = 3;
          $scope.datas = JSON.stringify($scope.clients["data"]);
          $scope.datas.splice(_id,1);
       };
所以我给出了我想删除的id,但我得到了这个错误$scope.datas.splice不是函数,我尝试了一个简单的文件,它工作正常
[“aaa”,“bob”,“ccc”]
使用
indexof()
和splice,但在这个文件中json non:(

javascript中如何知道/比较正确的id


因此,请大家帮助我,非常感谢。

您之所以会遇到此错误,是因为它是一个数组方法,而您的
数据对象是一个字符串。您可能会将其与该方法混淆,该方法实际上是为字符串定义的

因此,正如cale_b所指出的,没有必要对JSON对象进行字符串化。将其保留为数组将为您提供更多功能。例如,如果您想删除
clients.data
中的第二个元素,您可以编写:

$scope.clients["data"].splice(1, 1);
如果您希望删除基于
id
属性的值,而不是对象在
data
数组中的位置,则可以使用和方法进行搜索,如下所示:

$scope.clients["data"].splice(
    $scope.clients["data"].indexOf(
        $scope.clients["data"].find(function(e) {
            return e.id == 2;
})), 1);
您可以使用filter()


在拼接出一个对象之前,你需要先将数据做成一个脚本数组,或者不要像你那样进行字符串化

Javascript:

   var index = 0;
   var myObj = {
  "count": 3,
  "data": [
    {
      "id": "1",
      "raison": "ABS",
      "email": "abs@abs.com",
      "tel": "021269999999"
    },
    {
      "id": "3",
      "raison": "PODL",
      "email": "abs@abs.com",
      "tel": "021269999999"
    }, {
      "id": "5",
      "raison": "dDMS",
      "email": "abs@abs.com",
      "tel": "021269999999"
    }
  ]
}

var newObj = JSON.parse(JSON.stringify(myObj));
newObj.data.splice(index, 1);
在我上面的示例中,我将其设置为索引0,但对于您的情况,您需要找到要删除的对象的索引,然后创建该索引。
拼接()接受一个开始索引和一个结束索引,您试图做的是传入一个id,但这不起作用。

这里的问题源于这样一个事实,即只能在数组上调用splice。JSON.stringify将JavaScript对象转换为字符串,以便它可以被其他不使用与JavaSc相同语法的语言传输和解析手稿

我假设$scope.clients[“data”]是JavaScript格式的。您可以通过控制台日志记录和检查它是数组还是对象来测试这一点

根据您给出的示例,类似这样的方法应该有效:

$scope.clients["data"].map(function(a){
    delete a.id;
    return a;
}
这将遍历数组中的每个项并删除id属性


编辑:Kevin Ternet使用filter和ES6 arrow函数提供了一个非常优雅的解决方案,非常值得一看。filter可能是解决此类问题的更好的函数
函数将基于字符串的JSON转换为一个可行的JSON对象。关于删除,我的答案只包括按索引删除,而不是按提供的id删除,@Danny的答案包括这一点

使用splice()将不起作用,因为JSON本身没有访问Javascript数组函数的权限。解决此问题的方法是使用angular的
fromJson()
函数,该函数将其转换为可用的Javascript数组

使用
fromJson()
函数,我们可以将此应用于您的JSON:

$scope.datas= '{"count":3,"data": [{"id":"1","raison":"ABS","email":"abs@abs.com","tel":"021269999999"},{"id":"3","raison":"PODL","email":"abs@abs.com","tel":"021269999999"},{"id":"5","raison":"dDMS","email":"abs@abs.com","tel":"021269999999"}]}'

$scope.exampleArray = angular.fromJson($scope.datas);
这样做将转换它并使其可用。从那里,您可以获取代码并对其进行一点修改,以便它能够与我们的新对象一起工作:

$scope.deleteRow = function() {
   var _id = 2; // Using 2 rather than 3 because of array indexes
   $scope.exampleArray.data.splice(_id,1);
};
此外,Angular还有一种方法可以使用其名称惊人的计数器部分将对象转换回可用的JSON对象;
toJson()


filter是在字符串上运行还是在数组上运行?我不相信这会起作用。
filter
是用于数组而不是
string
的方法,请注意,JSON.stringify返回一个字符串。filter函数不能应用于字符串(如前所述),但我们可以将其用于数组。假设$scope.datas是一个数组(如果没有,我们可以使用类似JSON.parse或angular.fromJson的东西),我们可以使用filter函数。由于filter()不改变原始数组,我们需要将它分配给它自己:$scope.datas.filter(item=>item.id!=\u id);是的,这可以在
JSON.stringify()之前完成调用了
。事实上,考虑到OP的问题,根本不需要字符串化,对吗?是的,我应该提到……更新post。为什么OP以javascript对象形式开始时使用
fromJson()
在json通常只是一个巨大的字符串的情况下似乎效果最好,尤其是当它作为文本来自外部文件时。仅提供一种替代的、基于角度的解决方案。需要明确的是,您确实可以在json对象上执行数组函数,请参阅。此外,这似乎不符合要求与OP试图完成的内容完全一致,因为
id
不一定与数组的索引一致。@DannyBuonocore我确实意识到可以在JSON对象上执行数组函数,但是,我通常将JSON作为巨大的字符串来处理,因此将其初始转换为JSON对象是我讨论的内容更新我的id部分的答案。您有几个问题:首先,这不是JSON文件,这是一个对象。其次,在尝试使用splice之前,在deleteRow函数之前,您不会将其转换为JSON。第三,除非您必须通过AJAX或其他需要传递字符串的方法发送数据,否则不要使用JSON。Javascript objECT更容易使用。下面是一个JSFIDLE,它为您提供了构建块:
$scope.deleteRow = function() {
   var _id = 2; // Using 2 rather than 3 because of array indexes
   $scope.exampleArray.data.splice(_id,1);
};