Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.10.2017, 19:33
Аспирант
Отправить личное сообщение для Luca Посмотреть профиль Найти все сообщения от Luca
 
Регистрация: 20.06.2017
Сообщений: 69

Ссылки на элементы составного объекта
Здравствуйте.
Есть массив объектов.
Если объект внутри массива обладает нужным свойством, то его надо удалить.
Если использую delete, то работает, а если splice, то "не так" работает.
Для прохода использую
for (var i = 0; i < arr.length; i++) {
////////...........
}

но delete, как известно, "оставляет дырки"

Последний раз редактировалось Luca, 19.10.2017 в 19:42.
Ответить с цитированием
  #2 (permalink)  
Старый 19.10.2017, 19:49
Аспирант
Отправить личное сообщение для Luca Посмотреть профиль Найти все сообщения от Luca
 
Регистрация: 20.06.2017
Сообщений: 69

можно проще сформулировать:
console.clear();
var arr = [1,2,3,4,5,6,7];
for(var i = 0; i < arr.length; i++){
     if ( arr[i] > 4) arr.splice(i, 1);
}
console.log(arr);

результат:
[1,2,3,4,6]

а как правильно удалить?
Ответить с цитированием
  #3 (permalink)  
Старый 20.10.2017, 00:28
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

Luca,
for при удалении делают с конца массива, так проще
или так
console.clear();
var arr = [1,2,3,4,5,6,7];
for(var i = 0; i < arr.length; ){
  if ( arr[i] > 4) arr.splice(i, 1);
  else i++
}
console.log(arr);
Ответить с цитированием
  #4 (permalink)  
Старый 20.10.2017, 00:40
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

delete использовать неправильно, он просто затирает пунктик.

splice сдвигает хвост массива, и если понадобится удалить много элементов, сложность будет O(N^2)

для линейной сложности такой вариант:
var arr = [1,2,3,4,5,6,7];

for (var p = 0, i = 0, le = arr.length; i < le; ++i) {
  if (!(arr[i] > 4)) {
    arr[p++] = arr[i];
  }
}
arr.length = p;

alert(arr.join(', '));

Последний раз редактировалось Alexandroppolus, 20.10.2017 в 00:42.
Ответить с цитированием
  #5 (permalink)  
Старый 20.10.2017, 02:35
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

var arr = [1,2,3,4,5,6,7];
for(var i = 0; i < arr.length; i++){
     if ( arr[i] > 4) {
     	arr.splice(i, 1);
        i--;
     }
}
console.log(arr);


var arr = [1,2,3,4,5,6,7];

arr = arr.filter(function(item) {
   return !(item > 4); //item <= 4
});

console.log(arr);

Последний раз редактировалось ruslan_mart, 20.10.2017 в 02:37.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исключить из переменной elems все элементы которые имеют родственные элементы с класс Fenix-77 Общие вопросы Javascript 2 12.04.2016 16:20
Внутри разворачивающегося по клику DIVа не работают ссылки JavaScriptNoob Элементы интерфейса 2 17.11.2015 00:01
Как вернуть div и все вложенные в него элементы в первоначальное состояние? lucky89 Общие вопросы Javascript 17 26.02.2015 18:41
смена ссылки у объекта I-Trap Общие вопросы Javascript 1 29.03.2010 11:34
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00