set contains duplicate objectid in js

solvedby is an array containing object id, (It should contain only distinct value. – this is what the target is.)

const whosolved = new Set(problem.solvedby);
            whosolved.add(job.userId);
            
            problem.solvedby =  Array.from(whosolved);
            console.log("...",whosolved);
            await problem.save();

but this code contains duplicate after console log i got

... Set(3) {
  new ObjectId("642832de152a5463a43878d2"),
  new ObjectId("64383c8a5384e6f95253dc0a"),
  new ObjectId("64383c8a5384e6f95253dc0a")
}

Here the last 2 values, that I pushed was from same user. The set contains duplicate value as can be seen from above result.
Although I expected it to contain only distinct value.

Synchronize scrolling between three divs proportionally

I have three divs: divA, divB and divC. I need to synchronize the scrolling between them proportionally so that:

  • if I scroll divA, divB and divC should be autoscrolled proportionally
  • if I scroll divB, divA and divC should be autoscrolled proportionally
  • the same with divC

The following code does that but the scrolling is very glitchy, I thought that implementing a flag (the ignoreEvent variable) would prevent scrolling conflicts and it does but only when there are two divs (divA and divB for instance), as soon as I add a third one the scrolling conflicts appear again.

let ignoreEvent = false;

function getScrollPercentage(element) {
  const scrollPercentage = element.scrollTop / (element.scrollHeight - element.offsetHeight);
  return scrollPercentage;

divA.addEventListener("scroll", function () {
  const ignore = ignoreEvent;
  ignoreEvent = false;
  if (!ignore) {
    ignoreEvent = true;
    const divA_scrolledPercentage = getScrollPercentage(divA);
    divB.scrollTop = divA_scrolledPercentage * (divB.scrollHeight - divB.offsetHeight);
    divC.scrollTop = divA_scrolledPercentage * (divC.scrollHeight - divC.offsetHeight);
  }  
});

divB.addEventListener("scroll", function () {
  const ignore = ignoreEvent;
  ignoreEvent = false;
  if (!ignore) {
    ignoreEvent = true;
    const divB_scrolledPercentage = getScrollPercentage(divB);
    divA.scrollTop = divB_scrolledPercentage * (divA.scrollHeight - divA.offsetHeight);
    divC.scrollTop = divB_scrolledPercentage * (divC.scrollHeight - divC.offsetHeight);
  }  
});

divC.addEventListener("scroll", function () {
  const ignore = ignoreEvent;
  ignoreEvent = false;
  if (!ignore) {
    ignoreEvent = true;
    const divC_scrolledPercentage = getScrollPercentage(divC);
    divA.scrollTop = divC_scrolledPercentage * (divA.scrollHeight - divA.offsetHeight);
    divB.scrollTop = divC_scrolledPercentage * (divB.scrollHeight - divB.offsetHeight);
  }  
});

Here it is a codesandbox

PD: I want to achieve this only with vanilla js.

How can I update the ‘products’ variable in Laravel Blade using data from an Ajax call?

I have the following script

<script type='text/javascript'>
    var CSRF_TOKEN = $('meta[name="csrf-token"]').attr('content');  
    // Delete record
    $(document).on("keypress", ".search" , function() {
      keyword = document.getElementById("search").value;
      console.log(keyword);
      if(keyword.length > 2){
        $.ajax({
        url: 'filter-products?keyword='+keyword,
        type: 'get',
        success: function(response){
          //set here
        },
        error: function (response) {
          if(response.status== '404'){
            alert('You need to login before you can start adding stores')
            window.location.href = "{{ route('login')}}";
          }
        }
        });
      }
    });
  </script>  

and the inside my blade file is this

@foreach($products as $product)
            <div style="margin-bottom:50px">
              <div class="uk-card" style="margin-bottom:20px">
                <div class="uk-card-media-top uk-inline uk-light">

My question is, how do i update ‘$products’ with the content returned from the ajax call if even possible?

I tried this ‘this.$set(‘products’, response)’ but I think this was more of a vue thing?

For Loop writing records to a file prints only last item

I’m trying to write forloop to a json file and it only prints last item in an array

    let rawdata = fs.readFileSync('./input_data.json');
    let jsondata = JSON.parse(rawdata);
    let result='';
    let key='';
    let data = {
       items: []
    } 
    myrecords=[];
      for(let i = 0; i < jsondata.records.length; i++) {
        let obj = jsondata.records[i];
        result = obj.Id
        items = jsondata.records[i].data
        data.items = [items];
        data.key=result
        myrecords.push(data)
      }
   var log_file = fs.createWriteStream(__dirname + '/output.json', {flags : 'w'});
   var log_stdout = process.stdout;
   console.log = function(d) {
    log_file.write(util.format(d) + 'n');
    log_stdout.write(util.format(d) + 'n');
   };
   console.log(JSON.stringify(myrecords, null, 2))

How to use result from calculation as first input of Calculator App

I am making a calculator app. So far, so good but I am having a hard time implementing a function where your previous result can be used as the first input of your next equation. For example: If you start out with 2+5, that equals 7. Then I would like to be able to just hit + 2 and get 9.


let operate = (a, operator, b) => {
  if (operator === "+") {
    return addition(a, b);
  } else if (operator === "-") {
    return subtraction(a, b);
  } else if (operator === "*") {
    return multiplication(a, b);
  } else if (operator === "/") {
    return division(a, b);
  } else {
    return "Invalid operator";
  }
};

//Function that populates the number display with the number that the mouse clicks on
let numbers = [];
let currentNumber = "";

$(".number").on("click", function (e) {
  let displayNum = $(e.currentTarget).text();
  currentNumber += displayNum;
  $(".display").text(currentNumber);
});

$(".operator").on("click", (e) => {
  let operator = $(e.target).text();
  numbers.push(parseInt(currentNumber));
  numbers.push(operator);
  currentNumber = "";
});

$(".equals").on("click", () => {
  numbers.push(parseInt(currentNumber));

  let a = numbers[0];
  let operator = numbers[1];
  let b = numbers[2];

  let result = operate(a, operator, b);
  $(".display").text(result);

  //numbers = [];
  //currentNumber = "";
  numbers.push(result);
  currentNumber = result;
});

$(".clear").on("click", () => {
  $(".display").text("0")
  numbers = [];
  currentNumber = "";
});

Problem that gltf data output by three.js Exporter cannot be used in model-viewer AR

I want to read the gltf data output by the Three.js Exporter in the model-viewer.

{"asset":{"version":"2.0","generator":"THREE.GLTFExporter"},"scenes":[{"nodes":[0]}],"scene":0,"nodes":[{"mesh":0}],"bufferViews":[{"buffer":0,"byteOffset":0,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":288,"byteLength":288,"target":34962,"byteStride":12},{"buffer":0,"byteOffset":576,"byteLength":192,"target":34962,"byteStride":8},{"buffer":0,"byteOffset":768,"byteLength":72,"target":34963}],"buffers":[{"byteLength":840,"uri":"data:application/octet-stream;base64,AACgQAAAoEAAAACAAACgQAAAoEAAAACAAACgQAAAoMAAAACAAACgQAAAoMAAAACAAACgwAAAoEAAAAAAAACgwAAAoEAAAAAAAACgwAAAoMAAAAAAAACgwAAAoMAAAAAAAACgwAAAoEAAAAAAAACgQAAAoEAAAAAAAACgwAAAoEAAAAAAAACgQAAAoEAAAAAAAACgwAAAoMAAAACAAACgQAAAoMAAAACAAACgwAAAoMAAAACAAACgQAAAoMAAAACAAACgwAAAoEAAAAAAAACgQAAAoEAAAAAAAACgwAAAoMAAAAAAAACgQAAAoMAAAAAAAACgQAAAoEAAAACAAACgwAAAoEAAAACAAACgQAAAoMAAAACAAACgwAAAoMAAAACAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAgD8AAIA/AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAgD8AAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AACAPwAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAIA/AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAgD8AAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AACAPwAAgD8AAAAAAAAAAAAAgD8AAAAAAAACAAEAAgADAAEABAAGAAUABgAHAAUACAAKAAkACgALAAkADAAOAA0ADgAPAA0AEAASABEAEgATABEAFAAWABUAFgAXABUA"}],"accessors":[{"bufferView":0,"componentType":5126,"count":24,"max":[5,5,0],"min":[-5,-5,0],"type":"VEC3"},{"bufferView":1,"componentType":5126,"count":24,"max":[1,1,0],"min":[-1,-1,-1],"type":"VEC3"},{"bufferView":2,"componentType":5126,"count":24,"max":[1,1],"min":[0,0],"type":"VEC2"},{"bufferView":3,"componentType":5123,"count":36,"max":[23],"min":[0],"type":"SCALAR"}],"materials":[{"pbrMetallicRoughness":{"metallicFactor":0,"roughnessFactor":0.9,"baseColorTexture":{"index":0}},"extensions":{"KHR_materials_unlit":{}}}],"textures":[{"sampler":0,"source":0}],"samplers":[{"magFilter":9729,"minFilter":9987,"wrapS":33071,"wrapT":33071}],"images":[{"mimeType":"image/png","uri":"data:image/png;base64,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"}],"meshes":[{"primitives":[{"mode":4,"attributes":{"POSITION":0,"NORMAL":1,"TEXCOORD_0":2},"indices":3,"material":0}]}],"extensionsUsed":["KHR_materials_unlit"]}

`

I used the Three.js Exporter to convert the image data into simple 3D data, and then read it into the model-viewer and tried to display the AR.(iphone & andriod)

The model is output as shown above.

However, I could load it in the model-viewer, but it doesn’t work when I press the AR button. Please let me know if there is a problem with the gltf data that is output.

whatsapp-web.js: is it possible to add a URL preview for WhatsApp message, like the Android client do?

Using the following code, I can successfully send text message to a phone number via WhatsApp using curl command:

const { Client } = require('whatsapp-web.js');
const qrcode = require('qrcode-terminal');
const express = require('express');
const bodyParser = require('body-parser');

const app = express();
app.use(bodyParser.json());

const client = new Client({
    puppeteer: {
        args: ['--no-sandbox'],
    }
});

client.on('qr', (qr) => {
    console.log('QR Code received, scan it with your phone.');
    qrcode.generate(qr, { small: true });
});

client.on('ready', () => {
    console.log('Client is ready!');
});

client.initialize();

app.post('/send-message', async (req, res) => {
    const { number, text } = req.body;

    if (!number || !text) {
        return res.status(400).json({ error: 'Missing number or text' });
    }

    try {
        await client.sendMessage(`${number}@c.us`, text);
        console.log(`Message sent to ${number}: ${text}`);
        res.status(200).json({ success: 'Message sent' });
    } catch (error) {
        console.error('Error sending message:', error);
        res.status(500).json({ error: 'Error sending message' });
    }
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

Then with curl, I can run

curl -X POST -H "Content-Type: application/json" -d '{"number": "1234567890", "text": "text http://stackoverflow.com "}'

but there’s no preview. Maybe I just need to add a wait() somewhere? Or something using axios?

How to not override my key every time I send data to local storage

I am trying to save strings to local storage submitted from a textbox and submit button. However the data overwrites every time a new string is submitted as the key stays the same. How do I use a new key every time so data is saved. I view the key value pairs via inspect.

I have tired using the following but .length is just reding the length of the string and is not correct. I have also tried localStorage.length. Is there a simple solution to this, it doesnt have to be a for loop. I have researched but not understood anything.

function setLocalStorage() {

let data = document.getElementById('textBox').value;
for (let i = 0; i < data.length; i++){
    localStorage.setItem("Key" + (i + 1), data)
};

document.getElementById("textBox").value = "";

}

How to chain Underscore methods to populate an object from nested array?

I have an array of objects – say, NFL teams. Each object (team) has a property – array of first names of team players.

var nflTeams = [
      { name: 'Kansas City Chiefs', playersFirstNames: ['Shane', 'Chad', 'Michael', 'Ronald', 'Blake', 'Noah'], champions: true },
      { name: 'Philadelphia Eagles', playersFirstNames: ['Jalen', 'Kenneth', 'Boston', 'Trey', 'Jack', 'Andre', 'Jack', 'Lane', 'Jason', 'Nakobe'], champions: false },
      { name: 'Cincinnati Bengals', playersFirstNames: ['Brandon', 'Joe', 'Chris', 'Joe', 'Tyler', 'Trenton', 'Trent', 'Mitchell', 'Alex', 'Trey', 'Ted'], champions: false },
      { name: 'San Francisco 49ers', playersFirstNames: ['Jimmy', 'Josh', 'Kyle', 'Jordan', 'Brandon', 'Danny', 'George', 'Tyler', 'Charlie', 'Jake', 'Nick', 'Nick', 'Kevin'], champions: false },
    ];

Expected result – an object with an occurrence of first names: {‘Joe’: 1, ‘Jimmy’: 2, ‘Jalen’: 1 ….}

My goal is to achieve it through the use of Underscore methods such as _.map(), _.flatten(), _.reduce() all chained together using _.chain().

My current attempt miserably fails at _.reduce() stage:

ar firstNameOccurence = { '{players firstName}': 0 };
    firstNameOccurence = _.chain (nflTeams)
      .map(function(team) {return team.playersFirstNames})
      .flatten()
      .reduce(function(newObject, firstName){
          console.log ('we have a first name of a player', firstName);
            return newObject[firstName] = 1 ? !newObject[firstName] :  newObject[firstName] += 1;
          
      }, {})
      .value();

Now it gives me just a boolean value of true. My ideal is try to use ternary expression because it looks more elegant. I tried using official Underscore documentation and some examples like this, this and this.

ID is showing Null when selected by document.getElementByID

I am facing Error While Doing DOM Manipulation in JS, Might be by any Update come in ECMA Script.

Had Created an id in HTML h1 Tag and then the code is pretty explanatory !

let heading = document.getElementById("myHeading");

console.log(heading);

In Browser Console window in Dev Tool, Giving Null instead of ID Selection.

Trying to select the ID by Document Object Model,