Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Уникальные объекты массива

Есть массив из 10 объектов. Примерно таких:
Javascript
1
2
3
4
5
{
sum: 1,
sign: '+',
count: 13
}
Как удалить все обьекты из массив у которых поле sum одинаковое?
Например у нас есть 3 объекта у которых sum = 2, их нужно удалить и т.д.
Ответ: Написал по-быстрому функцию. Вряд ли она оптимальна, зато работает.
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function deleteSameSum(input) {
  var obj = {};
  input.map(function(e, i){
    if (!obj[e.sum]) obj[e.sum] = [];
    obj[e.sum].push(i);
  });
  var same = {};
  for (i in obj) {
    if(obj[i].length > 1) for (var j = 0; j < obj[i].length; j++) same[obj[i][j]] = true;
  }
  var result = [];
  input.map(function(e, i){
    if (!same[i]) result.push(e);
  });
  return result;
}
Использование:
Javascript
1
2
input = deleteSameSum(input); // input - ваш массив объектов
console.log(input);
Вопрос: Несколько массивов в многомерный объект

Суть задачи такова, есть массивы:
var a=[1,2,3];
var b=[11,22,33];
Их них необходимо сделать такой объект:
var obj={"0":{"a":1,"b":11},"1":{"a":2,"b":22},"2":{"a":3,"b":33}};

Кто подскажет как это сделать максимально быстро, без перебора значений, а сразу все подставить??
Ответ:
Сообщение от BANO
for (var i=0;i<n;i++)
* * obj[i]={a:a[i],b:b[i],c:c[i],d:d[i],e:e[i],f:f[i],g:g[i]})
Теперь понял ...
Вопрос: Поиск свойства объекта в массиве.

Добрый день.
Есть объект

var  a = [];
    for (i = 0; i < 5; i++) {
        var car = {
            firmName: prompt("Enter a firm's name of your car"),
            modelName: prompt("Enter a model's name of your car"),
            engineDisp: +prompt("Enter a displacement engine")
        }
        a.push(car);
    }
        console.log(a);

Необходимо сделать поиск в массиве и показать все машины в которых свойство engineDisp > 2 .
Делаю так
for( i = 0; i < a.length; i++) {
        if (car.engineDisp > 2) {
            alert(a.indexOf(car));
        }
    }

Не могу додуматься почему оно выводит только один индекс. Подскажите, пожалуйста.
Ответ: Спасибо большое Вам ... буду продолжать учить
Вопрос: Перезагрузка свойств или удаление объекта без перезагрузки страницы

Всех приветствую,
есть такой винтажный плеер:
Загрузка композиций в нем происходит при создании объекта через передачу options:
$( '#vc-container' ).cassette(options);

В самой функции cassette происходит инициализация объекта через this._init:
$.Cassette= function( options, element ) {	
		this.$el = $( element );
		this._init( options );  	};

Данный метод описан в прототипе:
$.Cassette.prototype 	= {
		_init: function( options ) {
                // код.........
               this.$loader= this.$el.find( 'div.vc-loader' ).show();
                }    }

Задача: не перегружая страницу обновить переменную options в объекте, и заново объект инициализировать.

Я вижу два варианта решения:
1. Удалить объект и заново его создать с новыми параметрами. Но не понимаю как его можно удалить.
2. Передать параметры в прототип Cassette.prototype и запустить инициализацию.
В коде прототипа делаю ссылку на него извне: window.myOb=this;
Потом создаю новый объект-массив options={ songs: [ '333','222','777', '777', '888']};
Пытаюсь его инициализировать myOb.__proto__._init(options);
Выдает ошибку: TypeError: this.$el is undefined
Но данный элемент передается через функцию: $( '#vc-container' ).cassette(options).
Если же делать через повторный запуск функции (передачу нового массива), то ничего не происходит. Так как я понимаю объект уже создан.
Подскажите, пожалуйста, в каком направлении надо искать решение данной задачи?
Ответ: проблема решена.
при запуске плагина
 $( '#vc-container' ).cassette(options);
у элемента появляется объект, к которому можно обратиться через data. Соответственно, получить доступ к свойствам и методам.
Пример jQuery:
var element=$('#vc-container').data().cassette;
element.options.songs.length; // размер массива песен и т.д.
$('#vc-container').data('cassette').remove();  // удалить объект cassette из элемента
Вопрос: Быстрый поиск интервалов в массиве

Всем привет!
Подскажите пожалуйста быстрый, по возможности не сложный, алгоритм решения такой задачи.

У меня есть отсортированный большой массив с интервалами "beg" и "end".
И есть некий отрезок, например: [30, 60].
Нужно найти все пересечения этого отрезка с интервалами в массиве.

Самое простое это линейный поиск:
var intervals = [
	{beg: 8,   end: 16}, 
	{beg: 24,  end: 32}, 
	{beg: 40,  end: 48}, 
	{beg: 56,  end: 64}, 
	{beg: 72,  end: 80}, 
	{beg: 88,  end: 96}
];

var range = [30, 60];
var overlap = [];

for(i = 0; i < intervals.length; i++)
{
	var A = intervals[i].beg;
	var B = intervals[i].end;
	
	if(range[0] <= B && range[1] >= A)
	{
		overlap.push( intervals[i] );
	}
}
console.log(overlap);
Все работает, и в результате мы получим массив интервалов с которым полностью или частично пересекается наш диапазон:
{beg: 24, end: 32}
{beg: 40, end: 48}
{beg: 56, end: 64}
Но в этой реализации слишком много лишних итераций.

Первое что пришло в голову по оптимизации это бинарный поиск первого левого пересечения и добивка линейным поиском.
И тут проблема.
Я могу найти элемент в массиве "intervals" только если есть точное совпадение например "beg" с началом отрезка.
А как найти элемент между двумя значениями не могу придумать.
Ответ:
Сообщение от laimas
Тогда сразу двигаться вниз и вверх.
Это уже как тебе угодно...
Вопрос: Динамическое добавление массива в свойство объектов

есть код

Код Javascript
1
2
3
4
5
6
this.addArr=function(){
               for (var i=0;i< a.length;i++){
           //    (alert(window[a[i]+'.array'+i]=[]))
                  eval(' a[i].arrays_i=[] ')
                   alert(a[0].arrays_0)
               }
поидее надо в цикле добавлять к объектам массив,как я понял добавлять то получается но получившейся переменной не могу обратиться по имени возвращает undefined
Ответ: массив a следует объявить ещё ДО строки #2, где вы пытаетесь прочитать значение его свойства a.length
Вопрос: Поиск имени в массиве, введённом ранее

голос против
избранное
есть задани и к нему нужно написать скрипт,вот задание:

Циклом заполнить массив с помощью команды prompt в котором будет список из 5-ти любых имен
Потом вывести с помощью prompt сообщение с просьбой ввести имя пользователя Введенное имя, циклом сравнивать с именами в массиве
Если нет совпадения, то есть введенное имя пользователя не существует в массиве - выдавать с помощью alert сообщение об ошибке
Если есть совпадение - выводить сообщение "Андрей, вы успешно вошли". Вместо "Андрей" должно быть имя текущего пользователя

к нему я набросал код,но он не полный и я не могу понять,алгоритм дествий

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
var arr = [];
 
for (var i = 0; i < arr.length; i++);
 
 
var a = prompt("Enter your name");
 
if (a == arr) {
    alert( a + " вы успешно вошли! ");
} else{
    alert("Ошибка")
}
 Комментарий модератора 
Нарушаете 2 пункта (5.3 и 4.9)
вам предупреждение
Ответ: zlobobr, блииин... я про prompt забыл совсем
Вопрос: Как скрыть объекты массива по клику?

Код ActionScript 3
1
2
3
4
5
6
7
8
9
var tArray: Array = new Array(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22,t23,t24,t25,t26,t27,t28,t29,t30,t31,t32,t33,t34,t35,t36,t37,t38,t39,t40,t41,t42,t43,t44,t45,t46,t47,t48,t49,t50,t51,t52,t53,t54,t55,t56,t57,t58,t59,t60,t61,t62,t63,t64,t65,t66,t67,t68,t69,t70,t71,t72,t73,t74,t75,t76,t77,t78,t79,t80,t81,t82,t83,t84,t85,t86,t87,t88,t89,t90,t91,t92,t93,t94,t95,t96,t97,t98,t99,t100);
function h1de (e:MouseEvent):void
{
    tArray.alpha=1;
}
btn_show1.addEventListener(MouseEvent.CLICK,showt);
{
    t1.alpha=0;
}
В общем определил массив, нужно что бы фрагменты которые содержаться в массиве скрывались по нажатию на кнопку. В чем проблема? Скрывается только 1 фрагмент(t1) остальные нет. Помогите пожалуйста
Ответ: Спасибо огромное)
Вопрос: Вывод и поиск значение в массиве

Здравствуйте, пытаюсь решить задачку: Запрашивать у пользователя любимые имена. Вывести их на страницу. Спросить, как зовут пользователя. И если его имя есть в списке, то подчеркнуть его, а если нет, то добавить в массив и вывести на страницу. и что я в тупик зашел. подскажите что не так?

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var mas = [];
var x = 0;
do {
    mas[x] = prompt('Какое имя вам нравится', '');
 
    x++;
}
while (confirm('У вас есть ёще имена, которые вам нравятся?'));
 
var s = prompt("введите ваше имя", '');
for (i = 0; i < mas.length; i++) {
    if (mas[i] == s) {
        document.write("<span>" + mas + "</span>" + "</br>");
 
    } else if (mas[i] != s) {
        mas.push(s);
        document.write(mas + "</br>");
 
    }
 
}
Ответ:
HTML5
1
<ul id="names"></ul>
CSS
1
2
3
.highlight {
  text-decoration: underline;
}
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
var names = [];
 
askNames(names);
var userName = askUserName();
if (~names.indexOf(userName)) {
  printNames(names);
  highlightName(userName);
} else {
  names.push(userName);
  printNames(names);
 
}
 
function askNames(names) {
  do {
    names.push(prompt('Какое имя вам нравится?', ''));
  } while (confirm('У вас есть ёще имена, которые вам нравятся?'));
}
 
function askUserName() {
  return prompt('Введите ваше имя', '');
}
 
function printNames(names) {
  var namesWrapper = document.getElementById('names');
  for (var i = 0; i < names.length; i++) {
    var li = document.createElement('li');
    li.innerHTML = names[i];
    namesWrapper.appendChild(li);
  }
}
 
function highlightName(name) {
  var liNames = document.getElementById('names').children;
  for (var i = 0; i < liNames.length; i++) {
    if (liNames[i].innerHTML === name) {
      liNames[i].classList.add('highlight');
    }
  }
}
Вопрос: jgGrid - getRowData() возвращает пустой объект

Помогите разобраться, если верить описанию, то getRowData(rowId|ничего) должна возвращать объект со значениями найденной строки (имя свойства: значение) или массив таких объектов для всех строк. Однако, в моем примере, даже вызов ф-ии без параметра, дает пустой объект. Что делаю не так:
...
datatype: "json",
treeGrid: true,
ExpandColumn: "Name",
treeGridModel: 'nested',
colNames: ['Наименование', 'Имя группы', 'Id родителя', 'Ссылка на справочник'],
colModel: [
{ name: 'Id', index: 'Id', width: 100, sortable: true, key: true},
{ name: 'Name', index: 'Name', width: 200, sortable: true, editable: true },
{ name: 'ParentId', index: 'ParentId', width: 100, sortable: true, hidden: true },
{ name: 'Reference', index: 'Reference', width: 200, sortable: true, hidden: true }
],
...
ondblClickRow: function (rowId, iRow, iCol, e) { // по двойному нажатию будем менять содержимое правой части.

var rowD = $('tblTreeRefs').jqGrid("getRowData", rowId);
...

Да, в примере дерево, модель nested, все проиндексировано, все отображается правильно. Может данная функция не работает с деревьями? Такой информации не нашел. Сверял значения параметра roeId со значением в колонке Id (оно ключ) - все передается точно.
Ответ: Пока тема висит, такой вопрос. Начал пробовать другие вариант, например через свойство data таблицы и метода массива filter().

rowD = $('#tblTreeRefs').getGridParam("data").filter(func tion (item) {
return item.Id == rowId;
});
var referenceRef = "";
if (rowD.length > 0)
{
referenceRef = rowD[0].Reference;
}

Результат аналогичный, в принципе, пойдет такой вариант для поиска данных в массиве по какому либо из полей?