Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Работа с массивами (https://javascript.ru/forum/misc/61073-rabota-s-massivami.html)

Gerd199 03.02.2016 10:59

Работа с массивами
 
Как работать с массивами в js?

Необходимо составить два массива между которыми будет ключ к другому(в значения). Перебрать один из массивов в цикле выводя второй параллельно по ключу, как?

diga 03.02.2016 13:42

сделай объект, так разве не легче?
var o = {
  a: 'значение ключа a',
  b: 'значение ключа b'
}

headerquest 03.02.2016 14:04

Не уверен что понял, но возможно вот это:
var a=[0,1,2,3]
var b=[10,20,30,40]
for(var i = 0; i<a.length; i++) console.log(a[i], b[a[i]])

это по значениям. А пo ключам вот так:
var a=[0,1,2,3]
var b=[10,20,30,40]
for(var i = 0; i<a.length; i++) console.log(a[i], b[i])

vovang 02.04.2018 22:11

Есть два park и marshrut массива при нажатии кнопки Выехал по данным введённым в поле busn объект записывается в массив marsrut и удаляется из массива park.Когда записан один объект,то всё работает нормально.А когда добавляю второй объект,то в массив marshrut добавляется объект находящийся в массиве park первым.Как сделать,чтобы в массив marshrut записывался объект свойство которого введено в поле busn?
Код скрипта 2.js:
var park = new Array();
var marshrut = new Array();

function input(){
var busn = document.f.busn.value;
var name = document.f.fio.value;
var marsh = document.f.marsh.value;

var bus = {
busn:busn,
name:name,
marsh:marsh
};

var bus1 = Object.create(bus);
var Element=park.unshift(bus.busn+'/'+bus.name+'/'+'№'+bus.marsh);
}

function output(){
document.f.displey1.value=park;
document.f.displey2.value=marshrut;
}

function inpdel1(){
var busn=document.f.busn.value;
for(var i=0;i<park.length;i++){
if(busn=park){
marshrut.unshift(park[i]);
park.shift(park[i]);
}
}
}

function inpdel2(){
var busn=document.f.busn.value;
for(var i=0;i<marshrut.length;i++){
if(busn=marshrut){
park.unshift(marshrut[i]);
marshrut.shift(marshrut[i]);
}
}
}

Код страницы:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> Your Title Here </title>
<script type="text/javascript" src="2.js"></script>
</head>

<body>
<form name="f">
<table width="100">
<tr>
	<td>В парке</td>
	<td>На маршруте</td>
</tr>
<tr>
	<td><textarea name="displey1" rows="5" cols="20"></textarea></td>
	<td><textarea name="displey2" rows="5" cols="20"></textarea></td>
</tr>
</table>
<br>
Введите данные<br>
фио<br>
<input type="text" name="fio"><br>
номер автобуса<br>
<input type="text" name="busn"><br>
номер маршрута<br>
<input type="text" name="marsh"><br>
<input type="button" value="Ввод" onClick="input();"><input type="button" value="Выехал" onClick="inpdel1();">
<input type="button" value="Въехал" onClick="inpdel2();"><input type="button" value="Вывод" onClick="output();">
<br><input type="reset" value="Сброс"><input type="button" value="Поиск" onClick="();">
</form>
</body>
</html>

рони 02.04.2018 23:07

Цитата:

Сообщение от vovang
if(busn=park){
if(busn=marshrut){

???

vovang 03.04.2018 22:20

if(busn=park){
if(busn=marshrut){
Это поиск значения переменной busn в массивах park и marshrut.

рони 03.04.2018 22:50

Цитата:

Сообщение от vovang
Это поиск значения переменной busn в массивах park и marshrut.

ошибок много ... прочтите учебник более внимательно, пожалуйста.
https://learn.javascript.ru/

vovang 03.04.2018 23:01

В этом учебнике я не нашел поиска объекта по его свойствам в массиве.

j0hnik 03.04.2018 23:11

Цитата:

Сообщение от vovang (Сообщение 482224)
В этом учебнике я не нашел поиска объекта по его свойствам в массиве.

Это как так? есть объекты с какими-то свойствами, и есть массив с именами свойств во всех объектах, и по имени свойства надо найти объекты у которых есть такие свойства?

vovang 03.04.2018 23:25

А так,объект с свойствами создаётся и записывается в массив.И таких объектов может быть n-ное колличество.И требуется найти нужный объект по свойству.

рони 03.04.2018 23:35

массив поиск по свойству
 
vovang,
function searchProperty(array, property, value) {
  for (var i = 0; i < array.length; i++) {
    var item = array[i];
    if (property in item && item[property] == value) {
      return i;
    }
  }
  return -1;
}
var park = [{busn:111, name:222, marsh:123}, {busn:222, name:777, marsh:333}];
var marshrut = [];
var index = searchProperty(park, "name", "777");
alert(index);
var obj;
if (index !== -1) {
  obj = park.splice(index, 1)[0];
}
if (obj) {
  marshrut.push(obj);
}
alert(JSON.stringify(park));
alert(JSON.stringify(marshrut));

j0hnik 03.04.2018 23:40

arr.find(el=>Object.keys(el).some(el=>el=='нужное свойство'))
вернет первый найденный объект с нужным свойством
arr - это ваш массив с объектами

рони 03.04.2018 23:43

Цитата:

Сообщение от j0hnik
вернет первый найденный объект с нужным свойством

этот код работает?

j0hnik 03.04.2018 23:50

Цитата:

Сообщение от рони (Сообщение 482232)
этот код работает?

var arr = [{a:1},{b:2},{c:3}];
console.log(arr.find(el=>Object.keys(el).some(el=>el=='b')));

рони 04.04.2018 00:00

j0hnik,
:)
Цитата:

- Этот человек - программист, - поворачиваясь к Ватсону говорит сыщик. - Почему вы так решили, Холмс? - Это же элементарно. Он дал абсолютно правильный ответ, который абсолютно бесполезен.

j0hnik 04.04.2018 00:08

рони, пффф... ваш анекдот

j0hnik 04.04.2018 00:10

рони,
а что ваша программка делает?
явно что-то не по ТЗ :D

рони 04.04.2018 00:17

Цитата:

Сообщение от j0hnik
а что ваша программка делает?
явно что-то не по ТЗ

:blink:
ваш совет рабочий, но бесполезный, а пост №11 это то что нужно.

j0hnik 04.04.2018 00:18

var arr = [{busn:111, name:222, marsh:123}, {busn:222, name:777, marsh:333}];
var func = (a,b) => arr.find(el=> Object.keys(el).some(el=>el==a)&& Object.values(el).some(el=>el==b));
console.log(func('name', 777));

а теперь?

Но рабочий же, а вы сомневались, ай ай ай ..

рони 04.04.2018 00:22

Цитата:

Сообщение от j0hnik
а теперь?

но веть вам же дали массив
[{busn:111, name:222, marsh:123}, {busn:222, name:777, marsh:333}];
как это
Цитата:

Сообщение от j0hnik
Object.keys(el) == 'a'

будет искать среди множества свойств?

j0hnik 04.04.2018 00:40

рони переделал

рони 04.04.2018 00:51

Цитата:

Сообщение от j0hnik
рони переделал

ок...

vovang 04.04.2018 21:56

var park = [{busn:111, name:222, marsh:123}, {busn:222, name:777, marsh:333}];


Рони.Дело в том,что индекс элемента массива заранее не известен,т.к. данные вводятся через форму и на их основе создается объект,который потом будет записан в массив park.И найти нужный объект нужно исключительно по свойству busn.Это одно из условий работы программы.Поэтому массивы park и marshrut создаются отдельно через new Array.А функция input создаёт сам объект и записывает его в массив.

рони 04.04.2018 22:01

vovang,
так и в примере неизвестен индекс, и в примере находится
Цитата:

Сообщение от vovang
исключительно по свойству busn

Цитата:

Сообщение от vovang
А функция input создаёт сам объект и записывает его в массив.

только это добавить осталось, но желательно без
Цитата:

Сообщение от vovang
var bus1 = Object.create(bus);


vovang 04.04.2018 22:44

Вот функция добавления из массива park в массив marshrut
function inpdel1(){
var busn=document.f.busn.value;//доступ к полю ввода
for(var i;i<park.length;i++){
if(условие?){
marshrut.unshift(park[i]);//добавление в массив
park.shift(park[i]);//удаление из массива
}
}
}

Как записать условие,чтобы найти объект по свойству busn в массиве park?Без перезаписи всего скрипта.

рони 04.04.2018 23:20

Цитата:

Сообщение от vovang
найти объект по свойству busn в массиве park

:-? я же вам всё написал, пост №11 :(

рони 04.04.2018 23:24

vovang,
function searchProperty(array, property, value) {
  for (var i = 0; i < array.length; i++) {
    var item = array[i];
    if (property in item && item[property] == value) {
      return i;
    }
  }
  return -1;
}
function inpdel1(){
var busn = document.f.busn.value;//доступ к полю ввода
var index = searchProperty(park, "busn", busn);
var obj;
if (index !== -1) {
  obj = park.splice(index, 1)[0];
}
if (obj) {
  marshrut.push(obj);
}
}

vovang 05.04.2018 21:39

Рони.А каким образом будет запускаться функция searchProperty?

рони 05.04.2018 21:52

Цитата:

Сообщение от vovang
А каким образом будет запускаться функция searchProperty?

строка 12 пост №27.

vovang 05.04.2018 21:59

Т.е. вы хотите сказать,что после запуска функции inpdel1 когда выполнение кода дойдёт до строки 12 поста №27,то запустится searchProperty?

рони 05.04.2018 22:07

vovang,
да

vovang 05.04.2018 22:09

Так почему не работает?

рони 05.04.2018 22:11

Цитата:

Сообщение от vovang
Так почему не работает?

что не работает?

vovang 05.04.2018 22:12

Функция searchProperty

рони 05.04.2018 22:14

vovang,
где ваш код, который не работает?

vovang 05.04.2018 22:24

Может я что-то не понимаю.Вот мой код скрипта изначальный
var park = new Array();
var marshrut = new Array();
 
function input(){
var busn = document.f.busn.value;
var name = document.f.fio.value;
var marsh = document.f.marsh.value;
 
var bus = {
busn:busn,
name:name,
marsh:marsh
};
 
var bus1 = Object.create(bus);
var Element=park.unshift(bus.busn+'/'+bus.name+'/'+'№'+bus.marsh);
}
 
function output(){
document.f.displey1.value=park;
document.f.displey2.value=marshrut;
}
 
function inpdel1(){
var busn=document.f.busn.value;
/*for(var i=0;i<park.length;i++){
if(busn=park){
marshrut.unshift(park[i]);
park.shift(park[i]);
}
}*/
}
 
function inpdel2(){
var busn=document.f.busn.value;
for(var i=0;i<marshrut.length;i++){
if(busn=marshrut){
park.unshift(marshrut[i]);
marshrut.shift(marshrut[i]);
}
}
}

Вот ваш код
function searchProperty(array, property, value) {
  for (var i = 0; i < array.length; i++) {
    var item = array[i];
    if (property in item && item[property] == value) {
      return i;
    }
  }
  return -1;
}
function inpdel1(){
var busn = document.f.busn.value;//доступ к полю ввода
var index = searchProperty(park, "busn", busn);
var obj;
if (index !== -1) {
  obj = park.splice(index, 1)[0];
}
if (obj) {
  marshrut.push(obj);
}
}

Вставьте ваш фрагмент кода в полный скрипт.

рони 05.04.2018 22:28

Цитата:

Сообщение от vovang
if(busn=marshrut){

это бред и его нужно убрать, о чём вам написано в самом начале

vovang 05.04.2018 22:39

В функции inpdel1 этот бред
if(busn=marshrut){
отсуствует.Функция inpdel1 записывает в массив marshrut объект по свойству busn и удаляет этот же объект из массива park.На функцию inpdel2 можете не обращать внимания,она выполняет другие действия.Вставьте ваш фрагмент кода в общий скрипт.Чтобы было понятно как он распологается.

рони 05.04.2018 23:00

vovang,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">

  <script>
var park = new Array;
var marshrut = new Array;

function createBus() {
    var busn = document.f.busn.value;
    var name = document.f.fio.value;
    var marsh = document.f.marsh.value;
    var bus = {
        busn: busn,
        name: name,
        marsh: marsh
    };
    document.f.reset();
    return bus;
}

function showBusFromArray(array, elem) {
    var str = "";
    for (var i = 0; i < array.length; i++) {
        var item = array[i];
        str += JSON.stringify(item) + "\n";
    }
    elem.value = str;
}

function addBus() {
    var bus = createBus();
    park.push(bus);
    var elem = document.f.displey1;
    showBusFromArray(park, elem);
    elem = document.f.displey2;
    showBusFromArray(marshrut, elem);
}

function searchProperty(array, property, value) {
    for (var i = 0; i < array.length; i++) {
        var item = array[i];
        if (property in item && item[property] == value) {
            return i;
        }
    }
    return -1;
}

function fromParkToMarshrut() {
    var busn = document.f.busn.value;
    var index = searchProperty(park, "busn", busn);
    var obj;
    if (index !== -1) {
        obj = park.splice(index, 1)[0];
    }
    if (obj) {
        marshrut.push(obj);
    }
    document.f.reset();
    var elem = document.f.displey1;
    showBusFromArray(park, elem);
    elem = document.f.displey2;
    showBusFromArray(marshrut, elem);
};
  </script>
</head>

<body>
<form name="f">
<table width="100">
<tr>
  <td>В парке</td>
  <td>На маршруте</td>
</tr>
<tr>
  <td><textarea name="displey1" rows="5" cols="20"></textarea></td>
  <td><textarea name="displey2" rows="5" cols="20"></textarea></td>
</tr>
</table>
<br>
Введите данные<br>
фио<br>
<input type="text" name="fio"><br>
номер автобуса<br>
<input type="text" name="busn"><br>
номер маршрута<br>
<input type="text" name="marsh"><br>
<input type="button" value="Добавить автобус" onClick="addBus()">
<input type="button" value="Ввести номер автобуса, отправить на маршрут" onClick="fromParkToMarshrut()">

</form>

</body>
</html>

vovang 05.04.2018 23:29

И снова вы изменили весь скрипт.Складывается впечатление,только в написаном вами скрипте работает ваш фрагмент кода.Потому как в моём скрипте
var park = new Array();
var marshrut = new Array();
  
function input(){
var busn = document.f.busn.value;
var name = document.f.fio.value;
var marsh = document.f.marsh.value;
  
var bus = {
busn:busn,
name:name,
marsh:marsh
};
  
var bus1 = Object.create(bus);
var Element=park.unshift(bus.busn+'/'+bus.name+'/'+'№'+bus.marsh);
}
  
function output(){
document.f.displey1.value=park;
document.f.displey2.value=marshrut;
}
  
function searchProperty(array, property, value) {
  for (var i = 0; i < array.length; i++) {
    var item = array[i];
    if (property in item && item[property] == value) {
      return i;
    }
  }
  return -1;
}

function inpdel1(){
var busn=document.f.busn.value;
var index = searchProperty(park, "busn", busn);
var obj;
if (index !== -1) {
  obj = park.splice(index, 1)[0];
}
if (obj) {
  marshrut.push(obj);
}
}
,код
function searchProperty(array, property, value) {
  for (var i = 0; i < array.length; i++) {
    var item = array[i];
    if (property in item && item[property] == value) {
      return i;
    }
  }
  return -1;
}
function inpdel1(){
var busn = document.f.busn.value;//доступ к полю ввода
var index = searchProperty(park, "busn", busn);
var obj;
if (index !== -1) {
  obj = park.splice(index, 1)[0];
}
if (obj) {
  marshrut.push(obj);
}
}
неработает.


Часовой пояс GMT +3, время: 12:37.