Related
I have two arrays. My first array is multidimensional. I am looping over the first array and checking if the index matches HeaderIndex value on an object in my second array. If so I am returning a new array with updated object. However I do not want my returned array to have any undefined values... I tried using array.filter
Here is my code below
const Array1 = [
['Alex', 'Boe', 'MeowWolf', 'pizza', 'pink', 'MeowWolf', 'corsair', 'coarse hair'],
['Arron', 'Coe', 'Kmart', 'tofu', 'purple', 'purr pull'],
['Jane', 'Doe', 'Sears', 'tacos', 'orange', 'Sears', 'see ears'],
['John', 'Eoe', 'YugiOh', 'blueberries', 'magenta'],
['Suzie', 'Boe', 'Toyota', 'steroids', 'blue']
]
const Array2 = [{
header: 'First name',
HeaderIndex: 0
},
{
header: 'Last name',
HeaderIndex: 1
},
{
header: 'Company',
HeaderIndex: 2
},
{
header: 'Favorite food',
HeaderIndex: 3
},
{
header: 'Favorite color',
HeaderIndex: 4
},
]
const testResult = Array1.map(
(arr) => arr.map(
(string, index) => {
if (Array2.filter(
(obj) => obj.HeaderIndex === index)[0])
return {
"ChosenHeader": Array2.filter(
(obj) => obj.HeaderIndex === index),
"content": string
}
}))
console.log(testResult);
I am getting this result
0: (8) [{…}, {…}, {…}, {…}, {…}, undefined, undefined, undefined]
1: (6) [{…}, {…}, {…}, {…}, {…}, undefined]
2: (7) [{…}, {…}, {…}, {…}, {…}, undefined, undefined]
3: (5) [{…}, {…}, {…}, {…}, {…}]
4: (5) [{…}, {…}, {…}, {…}, {…}]
But I want something like this
0: (5) [{…}, {…}, {…}, {…}, {…}]
1: (5) [{…}, {…}, {…}, {…}, {…}]
2: (5) [{…}, {…}, {…}, {…}, {…}]
3: (5) [{…}, {…}, {…}, {…}, {…}]
4: (5) [{…}, {…}, {…}, {…}, {…}]
I guess you need something like this:
const result = array1.map((arr1, index) => {
if (array2.some((arr2) => arr2.HeaderIndex === index))
return {
ChosenHeader: array2.find(obj => obj.HeaderIndex === index),
content: arr1,
};
});
I am using a third party API which provides a nested JSON object in return. I'm converting this data into CSV. I have used http get request to get data. The data looks good in console but does not bind with HTML. When I download the CSV file, I only see objects. I should be able to see the value of those objects in the downloaded file instead. The CSV file is automatically downloaded when I navigate to that menu. I want it to download only on "Export CSV" button click. Can someone help me with it? Thanks.
Array(10)
0: {_id: "611368f375aeaa23cce260fa", customer: {…}, transaction: {…}, serviceProvider: {…}, couponSurvey: {…}, …}
1: {_id: "6113685775aeaa23cce260f4", customer: {…}, transaction: {…}, serviceProvider: {…}, couponSurvey: {…}, …}
2: {_id: "611269c43d37b7199c620db7", customer: {…}, transaction: {…}, serviceProvider: {…}, couponSurvey: {…}, …}
3: {_id: "611269843d37b7199c620db2", customer: {…}, transaction: {…}, serviceProvider: {…}, couponSurvey: {…}, …}
4: {_id: "611268f63d37b7199c620dad", customer: {…}, transaction: {…}, serviceProvider: {…}, couponSurvey: {…}, …}
5: {_id: "611268c73d37b7199c620da8", customer: {…}, transaction: {…}, serviceProvider: {…}, couponSurvey: {…}, …}
6: {_id: "61125dc428ed930c0e05c3b1", customer: {…}, transaction: {…}, serviceProvider: {…}, couponSurvey: {…}, …}
7: {_id: "6112565c28ed930c0e05c3ac", customer: {…}, transaction: {…}, serviceProvider: {…}, couponSurvey: {…}, …}
8: {_id: "611254b75dcb9a5af3b3b1a5", customer: {…}, transaction: {…}, serviceProvider: {…}, couponSurvey: {…}, …}
9: {_id: "611254605dcb9a5af3b3b1a2", customer: {…}, transaction: {…}, serviceProvider: {…}, couponSurvey: {…}, …}
Data looks like this in the console.
.ts file
loading = false;
showTransactionValue = false;
var: any;
bucket: any[] = [];
this.api.fetchTableData('transfer/get-transactions', params, true).then((data) => {
this.transID = '';
this.loading = false;
this.var = data.docs;
this.page.rows = data.docs;
this.page.count = data.total;
this.results(data);
console.log(data.docs);
Object.entries(this.var.matches).map( res => {
this.bucket.push(this.var[1])
});
},
.html file
<div class="form-group">
<button class="btn btn-primary waves-effect btn-sm text-white" (click)="results()">Export CSV</button>
</div>
<div *ngFor="let item of bucket;">{{item?._id}}</div>
Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 3 years ago.
Improve this question
I'm trying to map over my API to get the nodes.
Here is the format my API is in:
[
{
"agent": "....",
"managementDomain": "...",
"node": "..."
},
{
"agent": "....",
"managementDomain": "...",
"node": "..."
},
...
]
The format I need to get it into for react-select:
const colourOptions = [
{ value: 'orange', label: 'Orange' },
{ value: 'yellow', label: 'Yellow' },
{ value: 'green', label: 'Green' },
];
How I am mapping over it (using Redux for state management):
const alarms = this.props.dataReducer.alarmDetails
const {test} = alarms.map(alarm => ({value:alarm.node, label: alarm.node}))
The error I am getting:
TypeError: Cannot read property 'node' of null
console.log(this.props.dataReducer.alarmDetails)
(288) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, null, {…}, {…}, {…}, {…}, null, {…}, {…}, null, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, null, null, null, {…}, {…}, {…}, {…}, {…}, null, {…}, {…}, {…}, {…}, {…}, {…}, …]
[0 … 99]
0:
agent: "..."
managementDomain: null
node: "..."
What's the best way to map over the API to get the node from each object within the array?
This error is actually self explanatory. Your map code is alright. Problem seem to exist that some of the objects in array is null or empty, so when javascript is trying to find node property on that object, its hitting the rock.
Actually this.props.dataReducer.alarmDetails this data contains null value, something like..
[
{
"agent": "....",
"managementDomain": "...",
"node": "..."
},
{
"agent": "....",
"managementDomain": "...",
"node": "..."
},
null
...
]
So, maybe you can filter the null values:
this.props.dataReducer.alarmDetails.filter(data=>data)
and put map code here
this.props.dataReducer.alarmDetails.filter(data=>data).map(d => ({value:d.node, label: d.node}))
You can return something like this:
import React from "react";
import ReactDOM from "react-dom";
import Select from "react-select";
import "./styles.css";
const alarms = [
{ agent: 1, managementDomain: null, node: "node1" },
{ agent: 2, managementDomain: null, node: "node2" }
];
let teamsFromApi = alarms.map(team => { return {value: team.agent, label: team.node} });
function App() {
return (
<div className="App">
<Select options={teamsFromApi} />
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
Note: Replace node data.
You can check the example Codebox
I've asked this before but simplifying the question. I have a JSON with geo-coordinates that I'd like to map in d3/leaflet:
Here's the structure, when console.logging the JSON allSFEvents:
(36) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
And digging into one item:
#context: "http://schema.org"
#type: "MusicEvent"
endDate: "2019-01-27"
image: ""
location:
#type: "Place"
address: "San Francisco, CA"
geo:
#type: "GeoCoordinates"
latitude: 37.775
longitude: -122.4183333
__proto__: Object
name: "Natoma Cabana"
__proto__: Object
name: "Winter Olympics"
performer: {url: "https://www.bandsintown.com/a/217960-
winter-olympics?came_from=244", image: "", #type:
"MusicGroup", name: "Winter Olympics"}
startDate: "2019-01-27"
url: "https://www.bandsintown.com/e/1013280443-winter-olympics-at-natoma-cabana?came_from=244"
__proto__: Object
When I try to convert to latLong coordinates:
allSFEvents.forEach(function(d) {
d.latLong = new L.LatLng(allSFEvents.location.geo[0],//first position is latitude
allSFEvents.location.geo[1];//second position is longitude
console.log(d.latLong)
})
It gives me an error saying:
Cannot read property 'geo' of undefined
How do I loop through each item and run the L/.LatLong here? I seem to be stuck. The goal is to get distinct lat/long pairs for each item, in order to map it. Thanks in advance.
the forEach-function goes thru every element of your list and the parameter of the function is the one item of the list. So d is one item of your allSFEvents-Array.
https://www.w3schools.com/jsref/jsref_forEach.asp
So try the following:
allSFEvents.forEach(function(d) {
//here replace allSFEEvents with d then location should be set. And replace geo[0] with geo.latitude and geo[1] with geo.longitude because geo is not an array
d.latLong = new L.LatLng(d.location.geo.latitude,//first position is latitude
d.location.geo.longitude;//second position is longitude
console.log(d.latLong)
})
I have 4 arrays full of objects:
Array(16) [ {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, … ]
Array(27) [ {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, … ]
Array(21) [ {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, … ]
Array(16) [ {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, … ]
Each object contains a bit of information, that I want to display to the viewer:
0: Object { exchange: "NYSE", quote: "JPY", price: "3923.76016", … }
1: Object { exchange: "DEF", quote: "GBP", price: "3924.60972", … }
2: Object { exchange: "FEG", quote: "EUR", price: "3917.31980", … }
3: {…}
exchange: "NEX"
price: "3914.70000"
quote: "USD"
timestamp: "2018-12-31T07:47:11.253Z"
<prototype>: Object { … }
How can I
1) Assign a unique value to the array, ie. Array #1 is VTX, Array #2 is DEF, so that when I display it on the page, I don't need to change the ticker symbol (ie. VTX on exchange NEX is $100, and I only need to change the exchange name and currency/amount)
2) iterate over the arrays to where the iterator moves on to the next object in the array, let's say, every 2-3 seconds?
I'm doing this in React and have passed the data on to props, but now I'm stuck trying to figure this out.
1) You can store all your arrays in on object like this :
const myArrays = [
{
uniqueName: 'VTX',
infos: []
},{
uniqueName: 'DEF',
infos: []
}
]
2) You should store the index in the state, and make it change with setInterval in componentDidMount
componentDidMount() {
this.timerID = setInterval(
() => this.nextInfo(),
1000
);
}