Удалить элемент из файла json, используя angularjs

0

Я потерял много времени, пытаясь удалить элемент из файла Json

Это мой json файл

 {
  "count": 3,
  "data": [
    {
      "id": "1",
      "raison": "ABS",
      "email": "[email protected]",
      "tel": "021269999999"
    },
    {
      "id": "3",
      "raison": "PODL",
      "email": "[email protected]",
      "tel": "021269999999"
    }, {
      "id": "5",
      "raison": "dDMS",
      "email": "[email protected]",
      "tel": "021269999999"
    }
  ]
}

в контроллере мне это нравится

 $scope.deleteRow = function() {
  var _id = 3;
          $scope.datas = JSON.stringify($scope.clients["data"]);
          $scope.datas.splice(_id,1);
       };

поэтому я дал _id, что хочу удалить, но я получаю эту ошибку $ scope.datas.splice splice, а не функцию, я попробовал простой файл, который работал отлично ["aaa","bob,"ccc"] используя indexof() и splice, но в этом файле json non :(

Как в javascript может узнать/сравнить правильный идентификатор?

так что помогите мне, и спасибо большое.

  • 0
    У вас есть несколько проблем: во-первых, это не файл JSON, а объект. Во-вторых, вы не приводите его к JSON до тех пор, пока не выполните функцию deleteRow, прямо перед тем, как попытаться использовать соединение. Третье - не используйте JSON, если вам не нужно отправлять данные через AJAX или другие методы, требующие передачи STRING. С объектами Javascript работать намного проще. Вот JSFiddle, который дает вам строительные блоки: jsfiddle.net/cale_b/v187d45d

5 ответов

6
Лучший ответ

Вы получаете эту ошибку, потому что сращивание() является методом массива, в то время как ваш datas объект является строкой. Вы можете смутить это с помощью метода slice(), который действительно определен для строк.

Итак, как отметил cale_b, нет необходимости строгать ваш объект JSON. Оставляя его как массив, вы получите гораздо больше функциональности. Например, если вы хотите удалить второй элемент в clients.data, вы можете написать:

$scope.clients["data"].splice(1, 1);

И если вы хотите удалить значение на основе свойства id, а не позицию объекта в массиве data, его можно искать с помощью методов indexOf() и find(), например:

$scope.clients["data"].splice(
    $scope.clients["data"].indexOf(
        $scope.clients["data"].find(function(e) {
            return e.id == 2;
})), 1);
  • 1
    Да, и это можно сделать до JSON.stringify() . На самом деле, учитывая вопрос ОП, нет необходимости вообще разбираться, не так ли?
  • 0
    Да, я должен был упомянуть, что ... обновление поста.
1

вы можете использовать filter()

$scope.deleteRow = function() {
  var _id = 3;
      $scope.datas = JSON.stringify($scope.clients["data"]);
      $scope.datas.filter(item => item.id != _id);
};
  • 1
    Фильтр работает со строкой? Или массив?
  • 1
    Я не верю, что это сработает. Filter - это метод для массива, а не String и обратите внимание, что JSON.stringify возвращает вам строку.
Показать ещё 1 комментарий
0

Обновление. Мой ответ охватывает случай, когда ваш JSON является строкой изначально, поэтому использование функции fromJson() преобразует JSON на основе строк в работоспособный объект JSON. Что касается удаления, мой ответ охватывает только удаление по индексу, а не по id, @Danny отвечает на это.

Использование splice() не будет работать, поскольку сам JSON не имеет доступа к функциям массива Javascript. Решением этого будет использование угловой функции fromJson() которая преобразует его в рабочий массив Javascript.

https://docs.angularjs.org/api/ng/function/angular.fromJson

Используя fromJson() мы можем применить это к вашему JSON:

$scope.datas= '{"count":3,"data": [{"id":"1","raison":"ABS","email":"[email protected]","tel":"021269999999"},{"id":"3","raison":"PODL","email":"[email protected]","tel":"021269999999"},{"id":"5","raison":"dDMS","email":"[email protected]","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()

https://docs.angularjs.org/api/ng/function/angular.toJson

  • 0
    Почему fromJson() когда OP имеет его в форме объекта javascript для начала?
  • 0
    Использование fromJson() , по-видимому, лучше всего работает в ситуации, когда у нас есть json, который обычно представляет собой одну гигантскую строку, особенно когда он исходит из внешнего файла как просто текст. Просто предлагая альтернативное угловое решение.
Показать ещё 2 комментария
0

Ваша проблема здесь связана с тем, что сращивание можно вызывать только на массивах. JSON.stringify преобразует объект JavaScript в строку, поэтому он может быть перенесен и проанализирован другими языками, которые не используют тот же синтаксис, что и JavaScript.

Я предполагаю $ scope.clients ["data"] в формате JavaScript. вы можете проверить это путем ведомости консоли и проверки, является ли это массивом или объектом.

Основываясь на примере, который вы дали, что-то вроде этого должно работать:

$scope.clients["data"].map(function(a){
    delete a.id;
    return a;
}

Это приведет к повторению каждого элемента в массиве и удалению атрибута id. Если вы еще не знакомы с.map() в JavaScript, я советую вам прочитать об этом

EDIT: Kevin Ternet имеет довольно элегантное решение с использованием фильтров и функций ES6 arrow, которые стоит посмотреть. Фильтр, возможно, является лучшей функцией для использования в этой проблеме

0

Вам нужно сделать данные массивом javscript, прежде чем вы сможете спланировать объект. Или не стягивайте, как ваши дела.

Javascript:

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

var newObj = JSON.parse(JSON.stringify(myObj));
newObj.data.splice(index, 1);

В приведенном выше примере я установил индекс 0, но для вашего случая вам нужно будет найти индекс объекта, который вы хотите удалить, а затем введите индекс. splice() принимает начальный индекс и конечный индекс, то, что вы пытаетесь сделать, это передать id, и это не будет работать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню