Related
I have data like this:
let data = []
let weeks = [
{
"week": 1,
"crop": {
"aop": 1,
"actual": 2,
"kbm": 3
},
"hk": {
"aop": 4,
"actual": 5,
"kbm": 6
},
"outputHkAct": 7
},
{
"week": 2,
"crop": {
"aop": 11,
"actual": 12,
"kbm": 13
},
"hk": {
"aop": 14,
"actual": 15,
"kbm": 16
},
"outputHkAct": 17
},
]
i wanth to merge & get the value every week in crop(aop, actual, kbm), outputHkAct , hk(aop, actual, kbm), outputHkAct.
the output should be :
data = [1, 2, 3, 4, 5, 6, 7, 11, 12, 13, 14, 15, 16, 17]
anyone can help? thanks guys.
It can be solved by using forEach:
let data = []
let weeks = [
{
"week": 1,
"crop": {
"aop": 1,
"actual": 2,
"kbm": 3
},
"hk": {
"aop": 4,
"actual": 5,
"kbm": 6
},
"outputHkAct": 7
},
{
"week": 2,
"crop": {
"aop": 11,
"actual": 12,
"kbm": 13
},
"hk": {
"aop": 14,
"actual": 15,
"kbm": 16
},
"outputHkAct": 17
},
]
weeks.forEach(({crop,hk,outputHkAct})=>{
data.push(crop.aop);
data.push(crop.actual);
data.push(crop.kbm);
data.push(hk.aop);
data.push(hk.actual);
data.push(hk.kbm);
data.push(outputHkAct)
})
console.log(data)
You can suer for in loop which helps you to loop through an object
let weeks = [
{
"week": 1,
"crop": {
"aop": 1,
"actual": 2,
"kbm": 3
},
"hk": {
"aop": 4,
"actual": 5,
"kbm": 6
},
"outputHkAct": 7
},
{
"week": 2,
"crop": {
"aop": 11,
"actual": 12,
"kbm": 13
},
"hk": {
"aop": 14,
"actual": 15,
"kbm": 16
},
"outputHkAct": 17
},
]
let allValues = [];
weeks.map(obj=>{
for(let key in obj){
if(key === 'crop' || key === 'hk'){
for(let k in obj[key]){
allValues.push(obj[key][k])
}
}else if(key === 'outputHkAct'){
allValues.push(obj[key])
}
}
})
console.log(allValues)
weeks is an array of object.
So you have to iterate through weeks array (by using for-of, for-in, while, map, reduce, etc.) to get the object and now you can access the value of the object by using a key which you already know (crop(aop, actual, kbm), outputHkAct , hk(aop, actual, kbm), outputHkAct).
Here is the example by using reduce.
let weeks = [
{
"week": 1,
"crop": {
"aop": 1,
"actual": 2,
"kbm": 3
},
"hk": {
"aop": 4,
"actual": 5,
"kbm": 6
},
"outputHkAct": 7
},
{
"week": 2,
"crop": {
"aop": 11,
"actual": 12,
"kbm": 13
},
"hk": {
"aop": 14,
"actual": 15,
"kbm": 16
},
"outputHkAct": 17
},
];
let data = [...weeks.reduce((v, { crop, hk, outputHkAct }) => [...v, ...Object.values(crop), ...Object.values(hk), outputHkAct], [])];
console.log(data);
I have already asked a question - How to group elements of nested arrays?, and received a delightful answer. This question will be a bit like that, but not quite.
There is an array:
var ind = ["Apple", "Pear", "Banana"];
And another array:
var arr = [
[ "Pear", 12, 34, 54, 76, 23, 232 ],
[ "Apple", 54, 22, 11, 23, 21, 33 ],
[ "Banana", 54, 65, 11, 43, 66, 75 ],
[ "Pear", 23, 11, 46, 76, 33, 98 ],
[ "Apple", 12, 34, 54, 76, 23, 232 ],
[ "Banana", 54, 22, 11, 23, 21, 33 ],
];
How to combine all the values of the subarrays in order, as they go in the array ind, to make it like this:
var arr = [
["Apple", [54,12], [22,34], [11,54], [23,76], [21,23], [33,232]],
["Pear", [12,23], [34,11], [54,46], [76,76], [23,33], [232,38]],
["Banana", [54,54], [65,22], [11,11], [43,23], [66,21], [75,33 ]]
];
Filter the arr using array#filter based on the ind array. Then using array#reduce generate the desired output in an object lookup and then extract all the values using the Object.values().
const arr = [ [ "Pear", 12, 34, 54, 76, 23, 232 ], [ "Apple", 54, 22, 11, 23, 21, 33 ], [ "Banana", 54, 65, 11, 43, 66, 75 ], [ "Pear", 23, 11, 46, 76, 33, 98 ], [ "Apple", 12, 34, 54, 76, 23, 232 ], [ "Banana", 54, 22, 11, 23, 21, 33 ] ],
ind = ["Apple", "Pear", "Banana"],
matched = arr.filter(a => ind.includes(a[0])),
result = Object.values(matched.reduce((r,[fruit, ...rest]) => {
r[fruit] = r[fruit] || [fruit,[],[],[],[],[],[]];
rest.forEach((v,i) => r[fruit][i+1].push(v));
return r;
},[]));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
I have an array of objects that looks like this:
"data": [
{ "workout_id": 1, "user_id": 1, "shotLocation": 27, "shotAttempts": 20,"shotsMade": 19, "id": 1 },
{ "workout_id": 2, "user_id": 1, "shotLocation": 1, "shotAttempts": 10, "shotsMade": 9, "id": 2 },
{ "workout_id": 2, "user_id": 1, "shotLocation": 10, "shotAttempts": 10, "shotsMade": 7, "id": 3 },
{ "workout_id": 2, "user_id": 1, "shotLocation": 1, "shotAttempts": 30, "shotsMade": 29, "id": 4 },
{ "workout_id": 3, "user_id": 5, "shotLocation": 1, "shotAttempts": 10, "shotsMade": 9, "id": 5 },
{ "workout_id": 4, "user_id": 6, "shotLocation": 1, "shotAttempts": 30, "shotsMade": 15, "id": 6 },
{ "workout_id": 4, "user_id": 6, "shotLocation": 2, "shotAttempts": 20, "shotsMade": 14, "id": 7 }
]
I would like to create a new array of objects where I
reduce the user_ids to each unique user
then calculate the total shotAttempts and shotsMade for each user
like this:
"dataTotals" : [
{"id": 1, "user_id": 1, "shotAttempts": 90, "shotsMade": 64}
{"id": 2, "user_id": 5, "shotAttempts": 10, "shotsMade": 9}
{"id": 3, "user_id": 6, "shotAttempts": 50, "shotsMade": 29}
I plan on iterating over this new array of objects with a .map function to populate a leaderboard as more users record their data.
I've tried several different ways to achieve this based on what I've read about the .map and .reduce methods, as well as searching here and found something that's close, but it returns an object as indicated below.
like this:
// create new object to store results in
let newObj = {};
// loop through user objects
this.state.shotlogs.forEach(function(shotlog){
// check if user_id has already been added to newObj
if(!newObj[shotlog.user_id]){
// If it is the first time seeing this user_id
// we need to add shots attempted and shots made to prevent errors
newObj[shotlog.user_id] = {};
newObj[shotlog.user_id]['user_id'] = shotlog.user_id;
newObj[shotlog.user_id]['shotAttempts'] = 0;
newObj[shotlog.user_id]['shotsMade'] = 0;
}
// add shots attempted and made to newObj for this user
newObj[shotlog.user_id]['shotAttempts'] += shotlog.shotAttempts
newObj[shotlog.user_id]['shotsMade'] += shotlog.shotsMade
})
but this returns an object that looks like this and not an array of objects like above:
{
1: {user_id: 1, shotAttempts: 70, shotsMade: 64}
5: {user_id: 5, shotAttempts: 10, shotsMade: 9}
6: {user_id: 6, shotAttempts: 50, shotsMade: 29}
}
Any help for this new coder is greatly appreciated!!
const data = [
{ workout_id: 1, user_id: 1, shotLocation: 27, shotAttempts: 20, shotsMade: 19, id: 1 },
{ workout_id: 2, user_id: 1, shotLocation: 1, shotAttempts: 10, shotsMade: 9, id: 2 },
{ workout_id: 2, user_id: 1, shotLocation: 10, shotAttempts: 10, shotsMade: 7, id: 3 },
{ workout_id: 2, user_id: 1, shotLocation: 1, shotAttempts: 30, shotsMade: 29, id: 4 },
{ workout_id: 3, user_id: 5, shotLocation: 1, shotAttempts: 10, shotsMade: 9, id: 5 },
{ workout_id: 4, user_id: 6, shotLocation: 1, shotAttempts: 30, shotsMade: 15, id: 6 },
{ workout_id: 4, user_id: 6, shotLocation: 2, shotAttempts: 20, shotsMade: 14, id: 7 }
];
const shooters = data.reduce(
(results, current) => ({
...results,
[current.user_id]: {
user_id: current.user_id,
shotAttempts: current.shotAttempts + (results[current.user_id] ? results[current.user_id].shotAttempts : 0),
shotsMade: current.shotsMade + (results[current.user_id] ? results[current.user_id].shotsMade : 0)
}
}),
{}
);
console.log(shooters);
You can use Array.reduce, Object.values with ES6 destructuring and solve this in a concise manner:
const data = [{ "workout_id": 1, "user_id": 1, "shotLocation": 27, "shotAttempts": 20, "shotsMade": 19, "id": 1 }, { "workout_id": 2, "user_id": 1, "shotLocation": 1, "shotAttempts": 10, "shotsMade": 9, "id": 2 }, { "workout_id": 2, "user_id": 1, "shotLocation": 10, "shotAttempts": 10, "shotsMade": 7, "id": 3 }, { "workout_id": 2, "user_id": 1, "shotLocation": 1, "shotAttempts": 30, "shotsMade": 29, "id": 4 }, { "workout_id": 3, "user_id": 5, "shotLocation": 1, "shotAttempts": 10, "shotsMade": 9, "id": 5 }, { "workout_id": 4, "user_id": 6, "shotLocation": 1, "shotAttempts": 30, "shotsMade": 15, "id": 6 }, { "workout_id": 4, "user_id": 6, "shotLocation": 2, "shotAttempts": 20, "shotsMade": 14, "id": 7 } ]
const result = data.reduce((r,{workout_id, user_id, shotAttempts, shotsMade}) => {
r[user_id] = r[user_id] || {id: workout_id, user_id, shotAttempts: 0, shotsMade: 0}
r[user_id].shotAttempts += shotAttempts
r[user_id].shotsMade += shotsMade
return r
}, {})
console.log(Object.values(result))
You can use Array.prototype.reduce()
Code:
const data = [{ "workout_id": 1, "user_id": 1, "shotLocation": 27, "shotAttempts": 20,"shotsMade": 19, "id": 1 },{ "workout_id": 2, "user_id": 1, "shotLocation": 1, "shotAttempts": 10, "shotsMade": 9, "id": 2 },{ "workout_id": 2, "user_id": 1, "shotLocation": 10, "shotAttempts": 10, "shotsMade": 7, "id": 3 },{ "workout_id": 2, "user_id": 1, "shotLocation": 1, "shotAttempts": 30, "shotsMade": 29, "id": 4 },{ "workout_id": 3, "user_id": 5, "shotLocation": 1, "shotAttempts": 10, "shotsMade": 9, "id": 5 },{ "workout_id": 4, "user_id": 6, "shotLocation": 1, "shotAttempts": 30, "shotsMade": 15, "id": 6 },{ "workout_id": 4, "user_id": 6, "shotLocation": 2, "shotAttempts": 20, "shotsMade": 14, "id": 7 }];
const dataTotals = Object.values(data.reduce((a, c) => {
if (!a[c.user_id]) {
a[c.user_id] = {
id: c.workout_id,
user_id: c.user_id,
shotAttempts: c.shotAttempts,
shotsMade: c.shotsMade
};
} else {
a[c.user_id].shotAttempts += c.shotAttempts;
a[c.user_id].shotsMade += c.shotsMade;
}
return a;
}, {}));
console.log(dataTotals);
I have two arrays of arrays and am trying to find the difference.
var a = [[ 11, 24, 28, 38, 42, 44 ],
[ 7, 19, 21, 22, 29, 38 ],
[ 2, 21, 27, 30, 33, 40 ],
[ 6, 11, 12, 21, 34, 48 ],
[ 1, 10, 17, 31, 35, 40 ],
[ 1, 18, 26, 33, 36, 45 ],
[ 15, 21, 22, 24, 38, 46 ],
[ 5, 17, 21, 27, 29, 41 ],
[ 3, 7, 12, 16, 20, 28 ],
[ 9, 12, 13, 18, 30, 37 ],
[ 3, 19, 21, 31, 33, 46 ],
[ 6, 11, 16, 18, 20, 34 ],
[ 1, 3, 11, 13, 24, 28 ],
[ 12, 13, 16, 40, 42, 46 ],
[ 1, 3, 5, 36, 37, 41 ],
[ 14, 15, 23, 24, 26, 31 ],
[ 7, 13, 14, 15, 27, 28 ]];
var b = [[ 4, 7, 9, 21, 31, 36 ],
[ 2, 5, 6, 12, 15, 21 ],
[ 4, 7, 8, 15, 38, 41 ],
[ 11, 24, 28, 38, 42, 44 ],
[ 7, 19, 21, 22, 29, 38 ]];
How would I find:
c = [[ 2, 21, 27, 30, 33, 40 ],
[ 6, 11, 12, 21, 34, 48 ],
[ 1, 10, 17, 31, 35, 40 ],
[ 1, 18, 26, 33, 36, 45 ],
[ 15, 21, 22, 24, 38, 46 ],
[ 5, 17, 21, 27, 29, 41 ],
[ 3, 7, 12, 16, 20, 28 ],
[ 9, 12, 13, 18, 30, 37 ],
[ 3, 19, 21, 31, 33, 46 ],
[ 6, 11, 16, 18, 20, 34 ],
[ 1, 3, 11, 13, 24, 28 ],
[ 12, 13, 16, 40, 42, 46 ],
[ 1, 3, 5, 36, 37, 41 ],
[ 14, 15, 23, 24, 26, 31 ],
[ 7, 13, 14, 15, 27, 28 ]];
I had tried underscore:
_ = require('underscore');
_.difference(a,b);
But it doesn't work.
I also tried lodash:
_ = require('lodash');
_.differenceBy(a,b);
but it doesn't work either.
What am I doing wrong here?
Use _.differenceWith, and pass a comparator which compares two arrays, as in:
_.differenceWith(a, b, _.isEqual);
As mentioned by #dsl101,
_.xor([1, 2, 3], [2, 3, 4]);
// [1, 4]
I'm trying to search in a array which contains PeriodicElements to Perodify a given name. This link
http://www.lmntology.com/ is what exactly what I want to do. But I can't find tune the search to
return Elements with two letters, Basically it returns the first match.
For example
"CARL" the generic search would return - Carbon, Adamantium, Rearden, Latinum
where as "CARL" should also return - Carbon, Argon ,Latinum
Any suggestions? Or a fiddle would be greatly appreciated.
Fiddle: http://jsfiddle.net/9vxGL/12/
var table = [
"H", "Hydrogen", "1.00794", 1, 1,
"He", "Helium", "4.002602", 18, 1,
"Li", "Lithium", "6.941", 1, 2,
"Be", "Beryllium", "9.012182", 2, 2,
"B", "Boron", "10.811", 13, 2,
"C", "Carbon", "12.0107", 14, 2,
"N", "Nitrogen", "14.0067", 15, 2,
"O", "Oxygen", "15.9994", 16, 2,
"F", "Fluorine", "18.9984032", 17, 2,
"Ne", "Neon", "20.1797", 18, 2,
"Na", "Sodium", "22.98976...", 1, 3,
"Mg", "Magnesium", "24.305", 2, 3,
"Al", "Aluminium", "26.9815386", 13, 3,
"Si", "Silicon", "28.0855", 14, 3,
"P", "Phosphorus", "30.973762", 15, 3,
"S", "Sulfur", "32.065", 16, 3,
"Cl", "Chlorine", "35.453", 17, 3,
"Ar", "Argon", "39.948", 18, 3,
"K", "Potassium", "39.948", 1, 4,
"Ca", "Calcium", "40.078", 2, 4,
"Sc", "Scandium", "44.955912", 3, 4,
"Ti", "Titanium", "47.867", 4, 4,
"V", "Vanadium", "50.9415", 5, 4,
"Cr", "Chromium", "51.9961", 6, 4,
"Mn", "Manganese", "54.938045", 7, 4,
"Fe", "Iron", "55.845", 8, 4,
"Co", "Cobalt", "58.933195", 9, 4,
"Ni", "Nickel", "58.6934", 10, 4,
"Cu", "Copper", "63.546", 11, 4,
"Zn", "Zinc", "65.38", 12, 4,
"Ga", "Gallium", "69.723", 13, 4,
"Ge", "Germanium", "72.63", 14, 4,
"As", "Arsenic", "74.9216", 15, 4,
"Se", "Selenium", "78.96", 16, 4,
"Br", "Bromine", "79.904", 17, 4,
"Kr", "Krypton", "83.798", 18, 4,
"Rb", "Rubidium", "85.4678", 1, 5,
"Sr", "Strontium", "87.62", 2, 5,
"Y", "Yttrium", "88.90585", 3, 5,
"Zr", "Zirconium", "91.224", 4, 5,
"Nb", "Niobium", "92.90628", 5, 5,
"Mo", "Molybdenum", "95.96", 6, 5,
"Tc", "Technetium", "(98)", 7, 5,
"Ru", "Ruthenium", "101.07", 8, 5,
"Rh", "Rhodium", "102.9055", 9, 5,
"Pd", "Palladium", "106.42", 10, 5,
"Ag", "Silver", "107.8682", 11, 5,
"Cd", "Cadmium", "112.411", 12, 5,
"In", "Indium", "114.818", 13, 5,
"Sn", "Tin", "118.71", 14, 5,
"Sb", "Antimony", "121.76", 15, 5,
"Te", "Tellurium", "127.6", 16, 5,
"I", "Iodine", "126.90447", 17, 5,
"Xe", "Xenon", "131.293", 18, 5,
"Cs", "Caesium", "132.9054", 1, 6,
"Ba", "Barium", "132.9054", 2, 6,
"La", "Lanthanum", "138.90547", 4, 9,
"Ce", "Cerium", "140.116", 5, 9,
"Pr", "Praseodymium", "140.90765", 6, 9,
"Nd", "Neodymium", "144.242", 7, 9,
"Pm", "Promethium", "(145)", 8, 9,
"Sm", "Samarium", "150.36", 9, 9,
"Eu", "Europium", "151.964", 10, 9,
"Gd", "Gadolinium", "157.25", 11, 9,
"Tb", "Terbium", "158.92535", 12, 9,
"Dy", "Dysprosium", "162.5", 13, 9,
"Ho", "Holmium", "164.93032", 14, 9,
"Er", "Erbium", "167.259", 15, 9,
"Tm", "Thulium", "168.93421", 16, 9,
"Yb", "Ytterbium", "173.054", 17, 9,
"Lu", "Lutetium", "174.9668", 18, 9,
"Hf", "Hafnium", "178.49", 4, 6,
"Ta", "Tantalum", "180.94788", 5, 6,
"W", "Tungsten", "183.84", 6, 6,
"Re", "Rhenium", "186.207", 7, 6,
"Os", "Osmium", "190.23", 8, 6,
"Ir", "Iridium", "192.217", 9, 6,
"Pt", "Platinum", "195.084", 10, 6,
"Au", "Gold", "196.966569", 11, 6,
"Hg", "Mercury", "200.59", 12, 6,
"Tl", "Thallium", "204.3833", 13, 6,
"Pb", "Lead", "207.2", 14, 6,
"Bi", "Bismuth", "208.9804", 15, 6,
"Po", "Polonium", "(209)", 16, 6,
"At", "Astatine", "(210)", 17, 6,
"Rn", "Radon", "(222)", 18, 6,
"Fr", "Francium", "(223)", 1, 7,
"Ra", "Radium", "(226)", 2, 7,
"Ac", "Actinium", "(227)", 4, 10,
"Th", "Thorium", "232.03806", 5, 10,
"Pa", "Protactinium", "231.0588", 6, 10,
"U", "Uranium", "238.02891", 7, 10,
"Np", "Neptunium", "(237)", 8, 10,
"Pu", "Plutonium", "(244)", 9, 10,
"Am", "Americium", "(243)", 10, 10,
"Cm", "Curium", "(247)", 11, 10,
"Bk", "Berkelium", "(247)", 12, 10,
"Cf", "Californium", "(251)", 13, 10,
"Es", "Einstenium", "(252)", 14, 10,
"Fm", "Fermium", "(257)", 15, 10,
"Md", "Mendelevium", "(258)", 16, 10,
"No", "Nobelium", "(259)", 17, 10,
"Lr", "Lawrencium", "(262)", 18, 10,
"Rf", "Rutherfordium", "(267)", 4, 7,
"Db", "Dubnium", "(268)", 5, 7,
"Sg", "Seaborgium", "(271)", 6, 7,
"Bh", "Bohrium", "(272)", 7, 7,
"Hs", "Hassium", "(270)", 8, 7,
"Mt", "Meitnerium", "(276)", 9, 7,
"Ds", "Darmstadium", "(281)", 10, 7,
"Rg", "Roentgenium", "(280)", 11, 7,
"Cn", "Copernicium", "(285)", 12, 7,
"Uut", "Unutrium", "(284)", 13, 7,
"Fl", "Flerovium", "(289)", 14, 7,
"Uup", "Ununpentium", "(288)", 15, 7,
"Lv", "Livermorium", "(293)", 16, 7,
"Uus", "Ununseptium", "(294)", 17, 7,
"Uuo", "Ununoctium", "(294)", 18, 7
];
$("#b").click(function () {
var chars = $('#st').val().split("");
for (var i = 0; i < chars.length; i++) {
search(chars[i]);
}
});
function search (char)
{
for (var i = 0; i < table.length; i++) {
if (table[i] === char) {
console.log(table[i]+" "+table[i+1]+"\n");
}
}
}
This is my initial attempt, It only Matches one Character Case sensitive. I will keep updating this. Please have a look.