How to output an array in Javascript like a social media feed? - javascript

I'm using React for my application and I've put my data (objects) into an array. Is there a way to output my data (array of objects) that loads all at once (such as Twitter, Instagram, Facebook)?
Currently I'm using a for loop where it loads one by one from my latest post to the end.
Here's a sample for loop to demonstrate.
var myArray = [
{name: 'Dwayne', age: 28},
{name: 'Rob', age: 32},
{name: 'Marie', age: 22},
{name: 'Sarah', age: 40},
{name: 'Emma', age: 29},
{name: 'James', age: 30}
];
for (var i = myArray.length - 1; i >= 0; i--){
console.log(myArray[i].name, myArray[i].age);
}

Here's an example of using map to generate a <p/> element with name and age inside it.
render(){
const myArray = [
{name: 'Dwayne', age: 28},
{name: 'Rob', age: 32},
{name: 'Marie', age: 22},
{name: 'Sarah', age: 40},
{name: 'Emma', age: 29},
{name: 'James', age: 30}
];
return(
<div>
{myArray.map((item, index) => (
<p key={`${item.name}-${index}`}>
Name:{item.name}, Age:{item.age}
</p>
))}
</div>
)
}
The above code would output
<div>
<p>Name:Dwayne, Age:28</p>
<p>Name:Rob, Age:32</p>
<p>Name:Marie, Age:22</p>
<p>Name:Sarah, Age:40</p>
<p>Name:Emma, Age:29</p>
<p>Name:James, Age:30</p>
</div>

Related

How can i find all values in array of Docs which are equal or bigger than value

I have an array which has docs like this
[{name: "Tom", age: 20}, {name: "Frank", age: 25}, {name: "Susie", age: 29}, {name: "Tina", age: 32}]
how can i find all people who for example are less or equal then 30 ?
You can use filter()
const arr = [{name: "Tom", age: 20}, {name: "Frank", age: 25}, {name: "Susie", age: 29}, {name: "Tina", age: 32}];
const res = arr.filter(x => x.age <=30)
console.log(res)
If you want the names of the persons only then use map() after filter()
const arr = [{name: "Tom", age: 20}, {name: "Frank", age: 25}, {name: "Susie", age: 29}, {name: "Tina", age: 32}];
const res = arr.filter(x => x.age <=30).map(x => x.name)
console.log(res)
Use Object.entries to key a nested with index of element [index,value] then use filter() on that and at the end map() to get only index
const arr = [{name: "Tom", age: 20}, {name: "Frank", age: 25}, {name: "Susie", age: 29}, {name: "Tina", age: 32}];
const res = Object.entries(arr).filter(([_,v]) => v.age <=30).map(x => +x[0])
console.log(res)
Use Array.filter
let arr =[{name: "Tom", age: 20}, {name: "Frank", age: 25}, {name: "Susie", age: 29}, {name: "Tina", age: 32}];
let result = arr.filter(v => v.age <= 30);
console.log(result);
Yeh filter it is - and with some exagaration in readability:
const dox = [{name: "Tom", age: 20}, {name: "Frank", age: 25}, {name: "Susie", age: 29}, {name: "Tina", age: 32}]
const arrayWithPeopleWhoForExampleAreLessOrEqualThen30 =
dox.filter(peopleWhoForExampleAreLessOrEqualThen30)
function peopleWhoForExampleAreLessOrEqualThen30(doc){
return doc.age <= 30
}

Grouping nested dada

Say you have csv data file like this:
name, age
Bob, 27
George, 25
Bill, 22
Henry,27
Carol,25
Mary, 28
Harold,27
Jane, 25
I want to aggregate totals by age for a bar chart. So that I get totals like this: age 27(3), age 25(2), etc.
I am using d3 v4
As mentioned in the comments, you could use d3.nest:
const data = [
{name: 'Bob', age: 27},
{name: 'George', age: 25},
{name: 'Bill', age: 2},
{name: 'Henry', age: 27},
{name: 'Carol', age: 25},
{name: 'Mary', age: 28},
{name: 'Harold', age: 27},
{name: 'Jane', age: 25},
];
console.log(d3.nest()
.key(d => d.age)
.rollup(results => results.length)
.entries(data));
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.13.0/d3.min.js"></script>

ng-table sorting not working

I have created an application using ng-table, the application is working fine which had generated table using ng-table. The problem which i am facing is that the table sorting is not working. My code is as given below
Working Demo
html
<table ng-table="tableParams" class="table">
<tr ng-repeat="user in myValues">
<td data-title="'Name'" sortable="'name'">
{{user.name}}
</td>
<td data-title="'Age'" sortable="'age'">
{{user.age}}
</td>
</tr>
</table>
script
var app = angular.module('main', ['ngTable']).
controller('DemoCtrl', function($scope, $filter, ngTableParams) {
$scope.myValues = [{name: "Moroni", age: 50},
{name: "Tiancum", age: 43},
{name: "Jacob", age: 27},
{name: "Nephi", age: 29},
{name: "Enos", age: 34},
{name: "Tiancum", age: 43},
{name: "Jacob", age: 27},
{name: "Nephi", age: 29},
{name: "Enos", age: 34},
{name: "Tiancum", age: 43},
{name: "Jacob", age: 27},
{name: "Nephi", age: 29},
{name: "Enos", age: 34},
{name: "Tiancum", age: 43},
{name: "Jacob", age: 27},
{name: "Nephi", age: 29},
{name: "Enos", age: 34}];
$scope.tableParams = new ngTableParams({
sorting: {
name: 'asc'
}
}, {
getData: function($defer, params) {
$defer.resolve($filter('orderBy')($scope.myValues, params.orderBy()));
}
});
});
$defer.resolve($filter('orderBy')($scope.myValues, params.orderBy()));
will create a new sorted array but will not change $scope.myValues.
So either, you set $scope.myValues to the sorted array each time:
$scope.myValues = $filter('orderBy')($scope.myValues, params.orderBy());
$defer.resolve($scope.myValues);
Or use $data in ng-repeatinstead of myValues:
<tr ng-repeat="user in $data">
In your HTML you need to update the myValues to be $data.
<tr ng-repeat="user in $data">
Plunker
You're writing to $scope.myValues, and using that in the ng-repeat directive - but you're sorting the data only in getData() on the table params object.
getData() doesn't ever change $scope.myValues, it only uses it to return a sorted array. What you really want to do is:
Don't make the full dataset available on the scope, but store it in a variable inside the controller:
var data = [{name: "Moroni", age: 50}, ...]
$defer.resolve($filter('orderBy')(data, params.orderBy()));
Use $data inside the HTML code, because this is what accesses getData():
<tr ng-repeat="user in $data">

Passing java script function result to Angular ng-table

I have Angular ng-table where I load Json data to $data variable and display in the table.
function ngTable(){
var app = angular.module('main', ['ngTable']).
controller('DemoCtrl', function($scope, ngTableParams) {
var data = [{name: "Moroni", age: 50},
{name: "Tiancum", age: 43},
{name: "Jacob", age: 27},
{name: "Nephi", age: 29},
{name: "Enos", age: 34},
{name: "Tiancum", age: 43},
{name: "Jacob", age: 27},
{name: "Nephi", age: 29},
{name: "Enos", age: 34},
{name: "Tiancum", age: 43},
{name: "Jacob", age: 27},
{name: "Nephi", age: 29},
{name: "Enos", age: 34},
{name: "Tiancum", age: 43},
{name: "Jacob", age: 27},
{name: "Nephi", age: 29},
{name: "Enos", age: 34}];
$scope.tableParams = new ngTableParams({
page: 1, // show first page
count: 10 // count per page
}, {
total: data.length, // length of data
getData: function($defer, params) {
$defer.resolve(data.slice((params.page() - 1) * params.count(), params.page() * params.count()));
}
});
});
}
Additionally I have Java Script function returning some other Json data - function is called on button click.
function ReturnJson() {
var json = [];
$('body').on('click','button#test', function(){
var id = $(this).attr("value").val();
json = id;
});
return json;
}
How do I replace var data content with ReturnJson() every time on button click action ?
Simple assignment will work, but remember to reload the grid:
$scope.loadData = function () {
$scope.data = $scope.ReturnJson();
$scope.tableParams.reload();
}
$scope.ReturnJson = function () {
var json = [{name: "bb", age: 200},{name: "aaa", age: 100}];
return json;
}
Here is a working demo: http://plnkr.co/edit/Jw41uCmHGAfjkuoLIQor?p=preview

How can I update a row in a javascript array based on a key value?

I have an array of data like this:
var nameInfo = [{name: "Moroni", age: 50},
{name: "Tiancum", age: 43},
{name: "Jacob", age: 27},
{name: "Nephi", age: 29},
{name: "Enos", age: 34}];
If I have an object like this:
var nameInfo = {name: "Moroni", age: 51};
Is there a simple way that I can update the variable nameInfo. The key
between these is the name column. I know there is a way that I could
do this by searching for the row, removing and adding but I would like
to have a way to do this where I updated the row. Note that if it helps I do have underscore.js loaded.
Easiest way is to just loop over and find the one with a matching name then update the age:
var newNameInfo = {name: "Moroni", age: 51};
var name = newNameInfo.name;
for (var i = 0, l = nameInfo.length; i < l; i++) {
if (nameInfo[i].name === name) {
nameInfo[i].age = newNameInfo.age;
break;
}
}
JSFiddle Example
Using underscore you can use the _.find method to do the following instead of the for loop:
var match = _.find(nameInfo, function(item) { return item.name === name })
if (match) {
match.age = newNameInfo.age;
}
JSFiddle Example
Edit:
You can use ES6 filter combined with arrow functions
nameInfo.filter(x => {return x.name === nametofind })[0].age = newage
You can use _.where function
var match = _.where(nameInfo , {name :nametofind });
then update the match
match[0].age = newage
var nameInfo = [{name: "Moroni", age: 50},{name: "Tiancum", age: 43},
{name: "Jacob", age: 27},{name: "Nephi", age: 29},
{name: "Enos", age: 34}
];
_.map(nameInfo, function(obj){
if(obj.name=='Moroni') {
obj.age=51; // Or replace the whole obj
}
});
This should do it. It's neat and reliable and with underscore
Using Underscore you can use _.findWhere http://underscorejs.org/#findWhere
_.findWhere(publicServicePulitzers, {newsroom: "The New York Times"});
=> {year: 1918, newsroom: "The New York Times",
reason: "For its public service in publishing in full so many official reports,
documents and speeches by European statesmen relating to the progress and
conduct of the war."}
You can use findWhere and extend
obj = _.findWhere(#songs, {id: id})
_.extend(obj, {name:'foo', age:12});
You can use the _.find method, like this:
var nameInfos = [{name: "Moroni", age: 50},
{name: "Tiancum", age: 43},
{name: "Jacob", age: 27},
{name: "Nephi", age: 29},
{name: "Enos", age: 34}];
var nameToSearch = "Moroni";
var myRecord = _.find(nameInfos, function(record){ return record.name === nameToSearch; });
Working example: http://jsfiddle.net/9C2u3/
var match = _.findWhere(nameInfo , {name :nametofind });
match.age = newage
A staright forward using lodash's find() function,
var nameInfo = [{name: "Moroni", age: 50},
{name: "Tiancum", age: 43},
{name: "Jacob", age: 27},
{name: "Nephi", age: 29},
{name: "Enos", age: 34}];
var objToUpdate = _.find(nameInfo, {name: "Moroni"});
if(objToUpdate) objToUpdate.age = 51;
console.log(nameInfo); // Moroni age will be 51;
Note: If there are multiple Moroni objects, _.find can fetch the first match only.

Categories

Resources