• Как добавить другие уникальные свойства в уже существующую?

    @StockholmSyndrome
    const result = data.reduce((acc, curr) => {
      const {category, family, symbol, id} = curr;
      acc.category[category] = acc.category[category] || {family: {}};
      acc.category[category].family[family] = acc.category[category].family[family] || {symbol: {}};
      acc.category[category].family[family].symbol[symbol] = acc.category[category].family[family].symbol[symbol] || {id: []};
      acc.category[category].family[family].symbol[symbol].id.push(id);
      return acc;
    }, {category: {}});
    Ответ написан
    1 комментарий
  • Как добавить уникальные свойства в название выпадающего списка?

    agmegadeth
    @agmegadeth
    Веб-разработчик в дизайн студии
    Я сделал решение только конечного числа заранее известных массивов из твоего примера. Можно улучшить, чтобы больше автоматизировать, но работает на твоих данных из вопроса:
    const A = [{category: "Walls", id: "1"}, {category: "Walls", id: "2"}];
    const B = [{category: "Window", id: "3"}, {category: "Walls", id: "4"}];
    const C = [{category: "Walls", id: "5"}, {category: "Floor", id: "6"}];
    const D = [{category: "Walls", id: "5"}, {category: "Walls", id: "6"}];
    
    let newArr = [];
    newArr['Walls'] = [];
    newArr['Window'] = [];
    newArr['Floor'] = [];
    
    const allArr = {'A':A,'B':B,'C':C,'D':D};
    
    for (let key in allArr) {
    	allArr[key].forEach(function (item) {
    		let tempItem = {'id': item.id, 'class': key};
    		newArr[item.category].push(tempItem);
    	});
    }
    
    for (let key in newArr) {
    	let section = $('<details></details>');
    	let summary = $('<summary>'+key+'</summary>');
    
    	section.appendTo('body');
    	section.append(summary);
    
    	newArr[key].forEach(function (item) {
    		console.log(item);
    		let newElement = $('<button class="'+item.class+'">'+item.id+'</button>');
    		section.append(newElement);
    	})
    }
    Ответ написан
    3 комментария
  • Как добавить уникальные свойства в название выпадающего списка?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    function makeDOM(html) { //Формируем DOM на основе структуры
    	for(let category in html) {
    		let det = document.createElement('details');
    		let cat = document.createElement('summary');
    		cat.innerText = category;
    		det.appendChild(cat);
    		html[category].forEach(o=>{
    			let button = document.createElement('button');
    			button.className = o.k;
    			button.innerText = o.id;
    			det.appendChild(button);
    		});
    		document.body.appendChild(det);
    	}
    }
    
    let html = {};
    function makeButton(o) { //Формируем структуру
    	if (typeof o !== "object") return;
    	if (o instanceof Array) {
    		let k = o[o.length-1];
    		o.forEach(e=>{e.k=k,makeButton(e)});
    		return;
    	}
    	if (!o.id) {
    		for(let k in o) makeButton(o[k].concat([k]));
    		return;
    	}
    	let summary;summary = html[o.category] ||(summary = html[o.category] = []);
    	summary.push({k:o.k,id:o.id});
    }
    
    window.addEventListener('DOMContentLoaded',e=>{
    	makeButton({A:A,B:B,C:C,D:D});
    	makeDOM(html);
    });
    Ответ написан
    4 комментария
  • Как добавить уникальные свойства в название выпадающего списка?

    Relow
    @Relow
    Ничего не умею
    https://www.youtube.com/watch?v=wsJbCvHkaKU
    В этом видео ты сможешь понять принцип перебора массива объектов.
    Ответ написан
  • Как последовательно загрузить модели в главный контейнер?

    @inzeppelin
    Судя по всему, у вас есть событие onDocumentLoadSuccess. Вы можете использовать его, чтобы реализовать загрузку моделей по очереди. В самой простой и наглядной реализации можно сделать что-то вроде:

    // это начальный индекс модели
    const i = 0;
    
    // коллбэк на успешную загрузку
    const onDocumentLoadSuccess = () => {
      i++;
      (if arrId[i]) {
        loader(i);
      } else {
        alert('все модели загружены');
      }
    };
    
    // функция принимает индекс модели в массиве и запускает лоадер
    const loader = (modelIndex) => {
      Autodesk.Viewing.Document.load(arrId[modelIndex], onDocumentLoadSuccess, onDocumentLoadFailure);
    };
    
    // запускаем лоадер для нулевого элемента
    loader(i);


    Соответственно сначала отработает первая модель, сработает коллбэк успешной загрузки, мы инкрементируем индекс и запускаем вторую модель, и т.д. до тех пор пока не загрузим все модели.
    Ответ написан
    Комментировать
  • Как передать нужное свойство объекта из одного массива в объект другого массива?

    freislot
    @freislot
    Frontend-разработчик
    const arrOne = [
      { group: "Dog", key: "bad", value: "7" },
      { group: "Cat", key: "dear", value: "13" },
      { group: "Cat", key: "good", value: "20" },
    ];
    
    const arrTwo = [
      { group: "Dog", key: "bad", value: "265" },
      { group: "Cat", key: "dear", value: "529" },
      { group: "Cat", key: "good", value: "956" },
    ]
    let arrThree = [];
    
    arrOne.forEach((itm, i) => {
      arrThree.push(Object.assign({}, itm, arrTwo[i]));
    });
    
    console.log(arrThree);


    только два одинаковых ключа value не может быть) у вас пример некорректный)
    Ответ написан
    1 комментарий
  • Как получить уникальные свойства двух массивом содержащих по одному объекту?

    RAX7
    @RAX7
    function diffCats(arr1, arr2) {
      return arr1.filter(obj1 => {
        return !arr2.some(obj2 => obj1.Category === obj2.Category && obj1.Value === obj2.Value);
      });
    }
    
    const arrUniq1 = diffCats(arrFirst, arrSecond);
    const arrUniq2 = diffCats(arrSecond, arrFirst);
    Ответ написан
    1 комментарий
  • Как переключать состояние по нажатию на кнопку?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Очень просто. Сделайте себе множитель, который будет менять знак переменной b, и меняйте значение этого множителя с -1 на 1 и обратно.

    const maths = document.querySelector('#Maths');
    let m = -1;
    maths.onclick = function() {
      let [a, b] = [3, 1];
      console.log(a + m * b);
      m *= -1; // меняем знак
    };
    Ответ написан
    1 комментарий
  • Как переключать состояние по нажатию на кнопку?

    hzzzzl
    @hzzzzl
    const maths = document.querySelector('#Maths');
    let doMinus = false
    maths.onclick = function() {
      let [a, b] = [3, 1];
      if (!doMinus) {  
         console.log(a + b) // 4 ; 
         doMinus = true 
      } else {  
         console.log(a - b) // 2  
      }
    };
    Ответ написан
    1 комментарий
  • Как удалить повторяющиеся элементы из объекта?

    @StockholmSyndrome
    как уже сказали, лучше сгруппировать по свойствам, но если не хочется, то…
    https://jsfiddle.net/ahzj9nqf/
    Ответ написан
    1 комментарий
  • Как удалить повторяющиеся элементы из объекта?

    @medin84
    software developer
    Предлагаю другой путь.
    Сперва сгруппировать по нужным полям.
    И имея дерево будет проще отрисовать.
    https://codesandbox.io/s/50y3y7ly8k

    [
      {
        "title": "Walls",
        "children": [
          {
            "title": "Basic Wall",
            "children": [
             .....
    Ответ написан
    1 комментарий
  • Как передать значение js объекта на html страницу?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Это массив, судя по ключам, можно использовать forEach
    Но если все же это объект (ключи не порядковые)
    let data = {...};
    let html = '';
    for (let k in data) {
      if (!data.hasOwnProperty(k)) continue;
      let item = data[k];
      html += '<ul>';
      html += '<li>'+item['category']+'</li>';
      html += '<li>'+item['symbol']+'</li>';
      // ...
      html += '</ul>';
    }
    document.getElementById('differencesDiv').innerHTML = html;
    Ответ написан
    2 комментария
  • Как извлечь из массива элементы, определённое свойство которых имеет уникальные значения?

    RAX7
    @RAX7
    Еще вариант:
    const notUniqueRevitids = data
      .reduce((acc, obj) => {
        if (acc[0].size === acc[0].add(obj.revitid).size) {
          acc[1].add(obj.revitid);
        }
        return acc;
      }, [new Set(), new Set()])[1];
    
    const uniqueObj = data.filter(obj => !notUniqueRevitids.has(obj.revitid));
    Ответ написан
    1 комментарий
  • Как извлечь из массива элементы, определённое свойство которых имеет уникальные значения?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const count = arr.reduce((acc, n) => (acc[n.revitid] = (acc[n.revitid] || 0) + 1, acc), {});
    const unique = Object.entries(count).filter(n => n[1] === 1).map(n => n[0]);
    const newArr = arr.filter(n => unique.includes(n.revitid));

    или

    const duplicate = arr.reduce((acc, n) => (acc[n.revitid] = acc.hasOwnProperty(n.revitid), acc), {});
    const newArr = arr.filter(n => !duplicate[n.revitid]);

    или

    const newArr = arr.filter(function(n) {
      return !this.get(n.revitid);
    }, arr.reduce((acc, { revitid: n }) => acc.set(n, acc.has(n)), new Map));

    или

    const newArr = arr.filter((n, i, a) => a.filter(m => m.revitid === n.revitid).length === 1);

    или

    const newArr = Object
      .values(arr.reduce((acc, n) => (acc[n.revitid] = acc[n.revitid] ? 1 : n, acc), {}))
      .filter(n => n !== 1);

    или

    const newArr = Object
      .values(arr.reduce((acc, n) => ((acc[n.revitid] = acc[n.revitid] || []).push(n), acc), {}))
      .flatMap(n => n.length === 1 ? n : []);
    Ответ написан
    1 комментарий
  • Почему не удаётся авторизоваться?

    @Abcdefgk
    Вообще, Axios - довольно забавный тип, в нем можно устанавливать "заголовки по умолчанию".
    И как не странно, это работает и на сервере.
    Вот такой, допустим, файл server.js
    const path = require('path');
    const express = require('express');           // For web server
    const bodyParser = require('body-parser');    // Receive JSON format
    const querystring = require('querystring');
    
    // Set up Express web server
    var app = express();
    app.use(bodyParser.json());
    // this line say of server, that we run server.js he open html file from public directory
    app.use(express.static(path.join(__dirname, 'public'))); // it was static(__ + 'public or www')
    
    // let's importing config.js file where are the configuration for dotenv/env and credentials_id/secret/url/PORT and scopes
    const config = require('./config');
    
    const PORT = config.credentials.PORT; // import from bim start.js
    const scopes = 'data:read data:write data:create bucket:create bucket:read';
    
    var indRouter = require('./routes/indRouter');
    indRouter(app);
    
    app.use((err, req, res, next) => {
      console.error(err);
      res.status(err.statusCode).json(err);
    });
    
    // This is for web server to start listening to port 3000
    app.listen(PORT, () => { 
      if (process.env.FORGE_CLIENT_ID == null || process.env.FORGE_CLIENT_SECRET == null) {
        console.log('*****************\nWARNING: Client ID & Client Secret not defined as environment variables.\n*****************');
      }
      console.log(`Server listening on port ${PORT}`);
    });

    В папке routes лежить вот такой файл indRouter.js
    var oauth = require('./oauth');
    var bucketCreate = require('./bucketCreate');
    var Axios = require('axios');
    var publ = require('./publ');
    var detail = require('./detail');
    
    module.exports = function(app) {
    	
    	app.get('/api/forge/oauth', function (req, res) {
    		oauth()
    			.then(function (response) {
    				// Success
    				var access_token = response.data.access_token;
    				Axios.defaults.headers.common['Authorization'] = 'Bearer ' + access_token;
    				//console.log(response);
    				res.redirect('/api/forge/datamanagement/bucket/create');
          })
    			.catch(function (error) {
    				// Failed
    				console.log(error);
    				res.send('Failed to authenticate');
    			});
    	});
    	
    	app.get('/api/forge/datamanagement/bucket/create', function (req, res) {
    		bucketCreate()
    			.then(function (response) {
    				// Success
    				//console.log(response);
    				res.redirect('/api/forge/datamanagement/bucket/detail');
          })
    			.catch(function (error) {
    				if (error.response && error.response.status == 409) {
    						console.log('Bucket already exists, skip creation.');
    						res.redirect('/api/forge/datamanagement/bucket/detail');
    				}
    				// Failed
    				console.log(error);
    				res.send('Failed to create a new bucket');
    			});
    	});
    	
    	app.get('/api/forge/oauth/public', function (req, res) {
        // Limit public token to Viewer read only
        publ()
    			.then(function (response) {
    				// Success
    				//console.log(response);
    				res.json({ access_token: response.data.access_token, expires_in: response.data.expires_in });
    			})
    			.catch(function (error) {
    				// Failed
    				console.log(error);
    				res.status(500).json(error);
    			});
    	});
    	
    	app.get('/api/forge/datamanagement/bucket/detail', function (req, res) {
    		detail()
    			.then(function (response) {
    				// Success
    				console.log(response);
    				res.redirect('/upload.html');
          })
          .catch(function (error) {
    				// Failed
    				console.log(error);
    				res.send('Failed to verify the new bucket');
          });
    	});
    	
    };

    И рядом с ним лежат файлы
    oauth.js
    const Axios = require('axios');
    const querystring = require('querystring');
    
    const config = require('../config');
    
    module.exports = function() {
      return Axios({
        method: 'POST',
        url: 'https://developer.api.autodesk.com/authentication/v1/authenticate',
        headers: {
          'content-type': 'application/x-www-form-urlencoded',
        },
        data: querystring.stringify({
          client_id: config.credentials.client_id,
          client_secret: config.credentials.client_secret,
          grant_type: 'client_credentials',
          scope: config.scopes.internal
        })
      });
    };

    bucketCreate.js
    const Axios = require('axios');
    const config = require('../config');
    
    // Prefix with your ID so the bucket key is unique across all buckets on all other accounts
    const bucketKey = config.credentials.client_id.toLowerCase() + '_my_first_full_viewer_bucket';
    const policyKey = 'transient'; // Expires in 24hr
    
      // Create an application shared bucket using access token from previous route
      // We will use this bucket for storing all files in this tutorial
    
    module.exports = function() {
      return Axios({
        method: 'POST',
        url: 'https://developer.api.autodesk.com/oss/v2/buckets',
        headers: {
          'content-type': 'application/json',
          //Authorization: 'Bearer ' + access_token
        },
        data: JSON.stringify({
          'bucketKey': bucketKey,
          'policyKey': policyKey
        })
      });
    };

    publ.js
    const Axios = require('axios');
    const querystring = require('querystring');
    const config = require('../config');
    
    module.exports = function() {
    	return Axios({
        method: 'POST',
        url: 'https://developer.api.autodesk.com/authentication/v1/authenticate',
        headers: {
          'content-type': 'application/x-www-form-urlencoded',
        },
        data: querystring.stringify({
    			client_id: config.credentials.client_id,
    			client_secret: config.credentials.client_secret,
    			grant_type: 'client_credentials',
    			scope: 'viewables:read'
        })
      });
    };

    detail.js
    var Axios = require('axios');
    const config = require('../config');
    
    // Prefix with your ID so the bucket key is unique across all buckets on all other accounts
    const bucketKey = config.credentials.client_id.toLowerCase() + '_my_first_full_viewer_bucket';
    
    module.exports = function() {
    	return Axios({
    		method: 'GET',
    		url: 'https://developer.api.autodesk.com/oss/v2/buckets/' + encodeURIComponent(bucketKey) + '/details',
    		//headers: {
    				//Authorization: 'Bearer ' + access_token
    		//}
      });
    };

    В первом обработчике (файл indRouter.js) установлен заголовок по умолчанию Authorization с токеном
    и больше его нигде писать не надо - он уже во всех запросах от Axios есть.
    Ответ написан
    3 комментария
  • Как передать значение промиса из одного файла в другой?

    @Abcdefgk
    server.js
    const path = require('path');
    const express = require('express');           // For web server
    const Axios = require('axios');               // A Promised base http client
    const bodyParser = require('body-parser');    // Receive JSON format
    const querystring = require('querystring');
    
    // Set up Express web server
    let app = express();
    app.use(bodyParser.json());
    // this line say of server, that we run server.js he open html file from public directory
    app.use(express.static(path.join(__dirname, 'public'))); // it was static(__ + 'public or www')
    
    // let's importing config.js file where are the configuration for dotenv/env and credentials_id/secret/url/PORT and scopes
    const config = require('./config');
    
    const PORT = config.credentials.PORT; // import from bim start.js
    const scopes = 'data:read data:write data:create bucket:create bucket:read';
    
    
    var oauth = require('./routes/oauth');
    var bucketCreate = require('./routes/bucketCreate');
    
    app.get('/api/forge/oauth', function(req, res) {
      oauth()
    		.then(function (response) {
    				// Success
    				// let's save token into the varible access_token
    				// Then, the app is routed to, which creates a shared bucket for our app.	
    				var access_token = response.data.access_token;
    				
    				bucketCreate(access_token)
    					.then(function (response) {
    						// Success
    						console.log(response);
    						res.redirect('/api/forge/datamanagement/bucket/detail');
    					})
    					.catch(function (error) {
    						if (error.response && error.response.status == 409) {
    							console.log('Bucket already exists, skip creation.');
    							res.redirect('/api/forge/datamanagement/bucket/detail');
    						}
    						// Failed
    						console.log(error);
    						res.send('Failed to create a new bucket');
    					});
    			})
          .catch(function (error) {
            // Failed
            console.error(error);
            res.send('Failed to authenticate');
          });
        });
    		
    		
    
    app.use((err, req, res, next) => {
      console.error(err);
      res.status(err.statusCode).json(err);
    });
    
    // This is for web server to start listening to port 3000
    app.listen(PORT, () => { 
      if (process.env.FORGE_CLIENT_ID == null || process.env.FORGE_CLIENT_SECRET == null) {
        console.log('*****************\nWARNING: Client ID & Client Secret not defined as environment variables.\n*****************');
      }
      console.log(`Server listening on port ${PORT}`);
    });

    oauth.js
    /*
     * Authentication
     */
    const Axios = require('axios');
    const querystring = require('querystring');        
    
    const config = require('../config');
    
    module.exports = function() {
      return Axios({
        method: 'POST',
        url: 'https://developer.api.autodesk.com/authentication/v1/authenticate',
        headers: {
          'content-type': 'application/x-www-form-urlencoded',
        },
        data: querystring.stringify({
          client_id: config.credentials.client_id,
          client_secret: config.credentials.client_secret,
          grant_type: 'client_credentials',
          scope: config.scopes.internal
        })
      });
    };

    backetCreate.js
    /*
     * Bucket Creation
     */
    const Axios = require('axios');
    const config = require('../config');
    
    // Prefix with your ID so the bucket key is unique across all buckets on all other accounts
    const bucketKey = config.credentials.client_id.toLowerCase() + '_my_first_full_viewer_bucket';
    const policyKey = 'transient'; // Expires in 24hr
    
      // Create an application shared bucket using access token from previous route
      // We will use this bucket for storing all files in this tutorial
    
    module.exports = function(access_token) {
    												console.log('!!!!!!!!!!!!! ' + access_token);
      return Axios({
        method: 'POST',
        url: 'https://developer.api.autodesk.com/oss/v2/buckets',
        headers: {
          'content-type': 'application/json',
          Authorization: 'Bearer ' + access_token
        },
        data: JSON.stringify({
          'bucketKey': bucketKey,
          'policyKey': policyKey
        })
      });
    };
    Ответ написан
    Комментировать
  • Как перейти на нужный адрес?

    @yapaha
    Разработчик
    Замените "router.get('/api/forge/oauth'.." на "router.get('/oauth'..." в oauth.js
    И app.use('/api/forgee', require('./routes/oauth')); на app.use('/api/forge', require('./routes/oauth'));

    Иначе у вас получается URL "/api/forgee/api/forge/oauth"
    Ответ написан
    1 комментарий
  • Как вызвать события при нажатия на кнопку enter?

    @vardoLP
    Ват ю сэй эбаут май мама?!
    у кнопки enter числовой код = 13 вешаете на него событие нажатия при этом отправляя данные на сервер через ajax, а там в обработчике php (так же можно и на стороне клиента проверить поля на пустоту, при нажатии) делаете какой-то ответ и с помощью json отправляете назад. Соответственно при нажатии на enter проверяете, что приходит от сервера. Если приходит норма, отправляете, если приходит ошибка выводите сообщение о ней.

    Это как пример логики
    Ответ написан
    1 комментарий
  • Как сделать, чтобы поля не падали друг на друга?

    @hesrun
    Божечки!!! Это неведомая плавающая "штука", называется - floating label. Что нужно сделать.
    1. Заходим на Кодпен
    2. Вбиваем в поиск "floating label"
    3. Выбираем что Вам угодно, на чистом js, jquery, react, vue, angular, без скриптов...
    Ответ написан
    2 комментария