Я потерял много времени, пытаясь удалить элемент из файла 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 может узнать/сравнить правильный идентификатор?
так что помогите мне, и спасибо большое.
Вы получаете эту ошибку, потому что сращивание() является методом массива, в то время как ваш 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);
JSON.stringify()
. На самом деле, учитывая вопрос ОП, нет необходимости вообще разбираться, не так ли?
вы можете использовать filter()
$scope.deleteRow = function() {
var _id = 3;
$scope.datas = JSON.stringify($scope.clients["data"]);
$scope.datas.filter(item => item.id != _id);
};
Filter
- это метод для массива, а не String
и обратите внимание, что JSON.stringify возвращает вам строку.
Обновление. Мой ответ охватывает случай, когда ваш 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()
fromJson()
когда OP имеет его в форме объекта javascript для начала?
fromJson()
, по-видимому, лучше всего работает в ситуации, когда у нас есть json, который обычно представляет собой одну гигантскую строку, особенно когда он исходит из внешнего файла как просто текст. Просто предлагая альтернативное угловое решение.
Ваша проблема здесь связана с тем, что сращивание можно вызывать только на массивах. 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, которые стоит посмотреть. Фильтр, возможно, является лучшей функцией для использования в этой проблеме
Вам нужно сделать данные массивом 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, и это не будет работать.