how to get difference item between two array object? - javascript

Here I have two array,but they are not the simple array.See below:
var a = [{"id":1,"in":1,"num":3000},{"id":2,"in":1,"num":1500},{"id":3,"in":1,"num":1000}]
var b = [{"id":1,"in":0,"num":1000},{"id":2,"in":0,"num":1000}]
for (var i = a.length - 1; i >= 0; i--) {
for (var j =b.length - 1; j >= 0; j--) {
if( a[i]['id'] == b[j]['id']){
a[i]['rest'] = a[i]['num'] - b[j]['num']
}
}
}
console.log(a)
but I cannot get the id 3, because id 3 was not in b array. Please help.
here is the answer i want
a = [
{"id":1,"in":1,"num":3000,"rest":2000},
{"id":2,"in":1,"num":1500,"rest":500},
{"id":3,"in":1,"num":1000,"rest":1000}
]
thk

So you want to substract the 'num' in b from the corresponding 'num' in a for every element of a? Than just iterate over a and check if it is contained also in b:
var a = [{"id":1,"in":1,"num":3000},{"id":2,"in":1,"num":1500},{"id":3,"in":1,"num":1000}]
var b = [{"id":1,"in":0,"num":1000},{"id":2,"in":0,"num":1000}]
for (var i = a.length - 1; i >= 0; i--) {
a[i]['rest'] = a[i]['num'];
for (var j =b.length - 1; j >= 0; j--) {
if( a[i]['id'] == b[j]['id']){
a[i]['rest'] = a[i]['num'] - b[j]['num'];
break;
}
}
}

you can add some variable for flag to know whether you have a same id or not, here's an example with your code
var flag;
var a = [{"id":1,"in":1,"num":3000},{"id":2,"in":1,"num":1500},{"id":3,"in":1,"num":1000}]
var b = [{"id":1,"in":0,"num":1000},{"id":2,"in":0,"num":1000}]
for (var i = a.length - 1; i >= 0; i--)
flag = false;
for (var j =b.length - 1; j >= 0; j--) {
if( a[i]['id'] == b[j]['id']){
a[i]['rest'] = a[i]['num'] - b[j]['num']
flag = true;
}
}
if(!flag) {
a[i]['rest'] = a[i]['num']
}
}

Related

longest common substring Multiple Input in JS

function LCSubStr(X, Y) {
let m = X.length;
let n = Y.length;
let result = 0;
let end;
let len = new Array(4);
for (let i = 0; i < len.length; i++) {
len[i] = new Array(n);
for (let j = 0; j < n; j++) {
len[i][j] = 0;
}
}
let currRow = 0;
for (let i = 0; i <= m; i++) {
for (let j = 0; j <= n; j++) {
if (i == 0 || j == 0) {
len[currRow][j] = 0;
}
else if (X[i - 1] == Y[j - 1]) {
len[currRow][j] = len[1 - currRow][j - 1] + 1;
if (len[currRow][j] > result) {
result = len[currRow][j];
end = i - 1;
}
}
else {
len[currRow][j] = 0;
}
}
currRow = 1 - currRow;
}
if (result == 0) {
return "-1";
}
return X.substr(end - result + 1, result);
}
// Driver Code
let X = "GeeksforGeeks";
let Y = "GeeksQuiz";
// function call
document.write(LCSubStr(X, Y));
How can I convert this code for multiple input?
I checked many lcs code but no one works with
ABCQEFDEFGHIJ BCXEFGYZBCDEWEFGHU > EFGH
This one just works good without any problem. I should convert this one for multiple input in Javascript.
Now we have X,Y but it shoulde be with multiple inputs.

print array in transpose format using jquery

I am little bit stuck in the below logic.
var t = new Array(),
i = 1;
for (var s = 0; s < 7; s++) {
t[s] = [];
for (j = 0; j < 7; j++) {
t[s][j] = i;
if (i === 6) {
i = 0;
}
i++;
}
}
console.log(t);
In my tried logic i am getting array like below
0: [1,2,3,4,5,6,1]
1: [2,3,4,5,6,1,2]
2: [3,4,5,6,1,2,3]
3: [4,5,6,1,2,3,4]
4: [5,6,1,2,3,4,5]
5: [6,1,2,3,4,5,6]
6: [1,2,3,4,5,6,1]
But I want output
0: [1,2,3,4,5,6,0]
1: [2,3,4,5,6,0,1]
2: [3,4,5,6,0,1,2]
3: [4,5,6,0,1,2,3]
4: [5,6,0,1,2,3,4]
5: [6,0,1,2,3,4,5]
6: [0,1,2,3,4,5,6]
Looking for help.
You can achieve it by rotating array.
let len = 7;
let a = Array.from(Array(len).keys());
let ans = [];
for(let i = 0; i < len; i++){
a = a.slice(1,a.length).concat(a.slice(0,1));
ans.push(a);
}
console.log(ans);
I would solve it in a different approach - You are building a two dimensional array that each new element (or row) is shifted or incremented by one (6 is the max value)
So increment each value by one and store the result.
$column = [1,2,3,4,5,6,0];
$max = 6;
$rows = 7;
$result = [];
for ($i = 0; $i < $rows; $i++) {
$result[$i] = [...$column];
for ($j = 0; $j < $column.length; $j++) {
if ($column[$j] == $max) $column[$j] = 0;
else $column[$j]++;
}
}
console.log($result);
reason of your bug
when doing so for the case i == 6
i = 0
i++
You are incrementing i twice... (from 6 to 1 instead of from 6 to 0)
You can:
if (i === 6) {
i = 0;
} else {
i++;
}
or more elegantly
i = (i + 1) % 7
Now you want i to be valid before assignment
t[s][j] = i will be not good if i == 7
so modulo it before
t[s][j] = i % 7
i++
let t = []
let i = 1
for (let s = 0; s < 7; s++) {
t[s] = []
i = s + 1 // start of your row
for (let j = 0; j < 7; j++) {
t[s][j] = i % 7
++i
}
}
console.log(t.map(r=>r.join(',')).join('\n'))
finally you can shorten your code by using map
let t = Array(7).fill(0).map( (r, i) => {
return Array(7).fill(0).map( (c, j) => ((i + 1) + j) % 7)
})
console.log(t.map(r=>r.join(',')).join('\n'))
Another approach is to use modulo. Using k % n will make the number rotate to 0 with every n
Also, you don't need the variable i. You could calculate it using s + j + 1 instead.
function p(a)
{
let str="";
for(i of a)
{
for(j of i)
{
str += j + " ";
}
str += "\n";
}
console.log(str);
}
var t = new Array();
var arraySize = 7;
var rotateEvery = 7;
for (var s = 0; s < arraySize; s++) {
t[s] = [];
for (j = 0; j < arraySize; j++) {
t[s][j] = (s + j + 1) % rotateEvery;
}
}
p(t);

There's a bug in my code

My code isn't working . I'm trying to figure out what the bug is . Can someone help ? ! It's a function that is supposed to return an array of the first n triangular numbers.
For example, listTriangularNumbers(5) returns [1,3,6,10,15].
function listTriangularNumbers(n) {
var num;
var array = [];
for (i = 1; i <= n; ++i) {
num = i;
for (j = i; j >= 1; --j) {
num = num + j;
}
array.push(num);
}
return array;
}
Your initial initialization of j is wrong, it's starting at i so it's going too high. Also switched the operators around to make sure the conditions work.
function listTriangularNumbers(n) {
var num;
var array = [];
for (i = 1; i <= n; i++) {
num = i;
for (j = i-1; j >= 1; j--) {
num = num + j;
}
array.push(num);
}
return array;
}
You can try below code to get help:
a = listTriangularNumbers(8);
console.log(a);
function listTriangularNumbers(n) {
var num;
var array = [0];
for (i = 1; i <= n; i++) {
num = 0;
for (j = 1; j <= i; j++) {
num = num + j;
}
array.push(num);
}
return array;
}
You actually don't need 2 for-loops to do this operation. A single for-loop would suffice.
function listTriangularNumbers(n) {
// Initialize result array with first element already inserted
var result = [1];
// Starting the loop from i=2, we sum the value of i
// with the last inserted element in the array.
// Then we push the result in the array
for (i = 2; i <= n; i++) {
result.push(result[result.length - 1] + i);
}
// Return the result
return result;
}
console.log(listTriangularNumbers(5));
function listTriangularNumbers(n) {
var num;
var array = [];
for (i = 1; i <= n; ++i) {
num = i;
for (j = i-1; j >= 1; --j) {
num = num + j;
}
array.push(num);
}
return array;
}
var print=listTriangularNumbers(5);
console.log(print);

detecting range overlaps in Google Calendar-Style event list

I need help fixing my existing code to accomplish what I am trying to do.
with the following sample data:
var SAMPLE_DATA = [{start: 30, end: 150}, {start: 540, end: 600}, {start: 560, end: 620}, {start: 610, end: 670}];
I need to do the following:
iterate through each sample object
determine if the current objects range (obj.start:obj.end) overlaps with any other object ranges.
record the total number of overlaps for that object into totalSlots property
determine the "index" of the object (used for it's left-to-right positioning)
mockup of what I am trying to accomplish:
As you can see in the mockup, slotIndex is used to determine the left-to-right ordering of the display. totalSlots is how many objects it shares space with (1 meaning it is the only object). 100 / totalSlots tells me how wide the square can be (i.e. totalSlots=2, means it is 100 / 2, or 50% container width).
Current Output from my code
Obj[0] slotIndex=0, totalSlots=0
Obj[1] slotIndex=1, totalSlots=1
Obj[2] slotIndex=1, totalSlots=2
Obj[3] slotIndex=0, totalSlots=1
expected/desired output from my code:
Obj[0] slotIndex=0, totalSlots=0
Obj[1] slotIndex=0, totalSlots=1
Obj[2] slotIndex=1, totalSlots=2
Obj[3] slotIndex=0, totalSlots=1
the code:
detectSlots: function(oldEventArr) {
oldEventArr.sort(this.eventSorter);
var newEventArr = [],
n = oldEventArr.length;
for (var i = 0; i < n; i++) {
var currObj = oldEventArr[i];
if ('undefined' == typeof currObj.totalSlots) {
currObj.slotIndex = 0;
currObj.totalSlots = 0;
}
for (var x = 0; x < n; x++) {
if (i == x) {
continue;
}
var nextObj = oldEventArr[x];
if (currObj.start <= nextObj.end && nextObj.start <= currObj.end) {
currObj.totalSlots++;
nextObj.slotIndex++;
}
}
newEventArr.push(currObj);
}
return newEventArr;
}
Please help me figure out what is going wrong in my code. I'm about 90% sure the problem lies in the if(currObj.start <= nextObj.end && nextObj.start <= currObj.end) statement where I am assigning/incrementing the values but I could use an extra set of eyes on this.
The slotIndex value can be calculated by using graph colouring algorithm. Note that brute force algorithm is exponential in time and will only be a viable solution for a small set of overlapping slots. Other algorithms are heuristics and you won't be guaranteed the least slot possible.
Here is an example of heuristic for your problem:
...
// init
var newEventArr = [], n = oldEventArr.length;
for (var i = 0; i < n; i+=1) {
var currObj = oldEventArr[i];
newEventArr.push({"start":currObj.start,"end":currObj.end,"slotIndex":undefined,"totalSlots":0});
}
var link = {};
// create link lists and totals
for (var i = 0; i < n; i+=1) {
var currObj = newEventArr[i];
if (!link.hasOwnProperty(""+i))
link[""+i] = {};
for (var j = i+1; j < n; j+=1) {
var nextObj = newEventArr[j];
var not_overlap = (currObj.end <= nextObj.start || nextObj.end <= currObj.start);
if (!not_overlap) {
currObj.totalSlots+=1;
nextObj.totalSlots+=1;
link[""+i][""+j] = 1;
if (!link.hasOwnProperty(""+j))
link[""+j] = {};
link[""+j][""+i] = 1;
}
}
}
var arrities = [];
for (var i = 0; i < n; i+=1) {
arrities.push( {"arrity":newEventArr[i].totalSlots, "indx":i} );
}
// sort by arrities [a better solution is using a priority queue]
for (var i = 0; i < n-1; i+=1) {
var current_arrity = -1, indx = -1;
for (var j = i; j < n; j+=1) {
if (arrities[j].arrity > current_arrity) {
indx = j;
current_arrity = arrities[j].arrity;
}
}
var temp = arrities[i];
arrities[i] = arrities[indx];
arrities[indx] = temp;
}
for (var i = 0; i < n; i+=1) {
var nodeIndex = arrities[i].indx;
// init used colors
var colors = [];
for (var j = 0; j < n; j+=1) {
colors.push(0);
}
//find used colors on links
for (var k in link[""+nodeIndex]) {
var color = newEventArr[k].slotIndex;
if (color || color === 0)
colors[color] += 1;
}
//find the first unused color
for (var j = 0; j < n; j+=1) {
if (colors[j] <= 0) {
// color the node
newEventArr[nodeIndex].slotIndex = j;
break;
}
}
}
return newEventArr;
...
like this
var not_overlap = (currObj.end <= nextObj.start || nextObj.end <= currObj.start);
if (!not_overlap) { ...
or
var overlap = (currObj.end > nextObj.start && nextObj.end < currObj.start);
if (overlap) { ...

javascript - missing ) after for-loop control

Im trying to solve problem #4 on project Euler,im using a simple for-loop to sift through each element of the array and "missing ) after for-loop control"
Code below
var palidrome = function (num) {
var numstr = (num).toString().split("");
var count = 0;
for (var i = 0, i2 = numstr.length - 1; i < numstr.length / 2 && i2 >= numstr.length / 2; i++, i2--) {
if (numstr[i] !== numstr[i2]) {
return 0;
} else {
if (count == 3) {
return numstr.join("");
}
}
count++;
}
};
for (var i = 999; i >= 100; i--) {
for (var j = 100; j = < i; j++) {
if (palidrome(i * j) !== 0) {
alert(palidrome(i * j));
break;
}
}
}
Thank you for the assistance,much appreciated.
In for loop you have error: j = < i must be j <= i
for (var i = 999; i >= 100; i--) {
for (var j = 100; j <= i; j++) {
if (palidrome(i * j) !== 0) {
alert(palidrome(i * j));
break;
}
}
}

Categories