-
-
Save jherr/cd442b46070b39e99dd8bedc9eecff5c to your computer and use it in GitHub Desktop.
[ | |
{ "name": "Atreides", "planets": "Calladan" }, | |
{ "name": "Corrino", "planets": ["Kaitan", "Salusa Secundus"] }, | |
{ "name": "Harkonnen", "planets": ["Giedi Prime", "Arrakis"] } | |
] |
interface House { | |
... | |
} | |
interface HouseWithID { | |
... | |
} | |
function findHouses(houses: string): HouseWithID[]; | |
function findHouses( | |
houses: string, | |
filter: (house: House) => boolean | |
): HouseWithID[]; | |
function findHouses(houses: House[]): HouseWithID[]; | |
function findHouses( | |
houses: House[], | |
filter: (house: House) => boolean | |
): HouseWithID[]; | |
console.log( | |
findHouses(JSON.stringify(houses), ({ name }) => name === "Atreides") | |
); | |
console.log(findHouses(houses, ({ name }) => name === "Harkonnen")); |
Thanks for challenge! 👍
My solution:
import houses from "./houses.json";
interface House {
name: string;
planets: string | string[];
}
interface HouseWithID extends House {
id: number;
}
type HouseFilter = (v: House) => boolean;
function findHouses(arg1: unknown, arg2?: HouseFilter): HouseWithID[] {
const houses: House[] = Array.isArray(arg1)
? [...arg1]
: JSON.parse(arg1 as string);
const mappedHouses: HouseWithID[] = houses.map((v: House, i: number) => ({
...v,
id: i
}));
if (arg2 && typeof arg2 === "function") {
return mappedHouses.filter(arg2);
}
return mappedHouses;
}
console.log(
findHouses(JSON.stringify(houses), ({ name }) => name === "Harkonnen")
);
const houses: House[] = [
{ name: 'Atreides', planets: 'Calladan' },
{ name: 'Corrino', planets: ['Kaitan', 'Salusa Secundus'] },
{ name: 'Harkonnen', planets: ['Giedi Prime', 'Arrakis'] },
];
interface House {
name: string;
planets: string | string[];
}
interface HouseWithID extends House {
id: number;
}
function findHouses(houses: string | House[], filter: (house: House) => boolean): HouseWithID[] {
const housesJSON = typeof houses === 'string' ? JSON.parse(houses) : houses;
const housesWithID: HouseWithID[] = housesJSON.map((house: House, index: number) => ({ ...house, id: index }));
return housesWithID.filter(filter);
}
console.log(findHouses(JSON.stringify(houses), ({ name }) => name === 'Atreides'));
console.log(findHouses(houses, ({ name }) => name === 'Harkonnen'));
@jherr thank you so much
for amazing series. This is my solution:
import data from "./houses.json";
interface House {
name: string;
planets: string | string[];
}
interface HouseWithID extends House {
id: number;
}
type HouseFilter = (house: House) => boolean;
function findHouses(
input: House[] | string,
filter: HouseFilter
): HouseWithID[] {
let houses: HouseWithID[] = [];
if (typeof input === "string") {
input = JSON.parse(input) as House[];
}
houses = input.map((item: House, index: number) => ({
...item,
...{ id: index },
}));
if (filter) {
houses = houses.filter(filter);
}
return houses;
}
console.log(
findHouses(JSON.stringify(data), ({ name }) => name === "Atreides")
);
console.log(findHouses(data, ({ name }) => name === "Harkonnen"));
const houses = require("./houses.json");
interface House {
name: string;
planets: string | string[];
}
interface HouseWithID extends House {
id: number;
}
type Filter = (house: House) => boolean;
function findHouses(houses: string): HouseWithID[];
function findHouses(houses: string, filter: Filter): HouseWithID[];
function findHouses(houses: House[]): HouseWithID[];
function findHouses(houses: House[], filter: Filter): HouseWithID[];
function findHouses(houses: unknown, filter?: Filter): HouseWithID[] {
if (houses == null) {
return [];
}
let house: HouseWithID[] = [];
if (typeof houses === "string") {
house = (JSON.parse(houses) as House[]).map((housemap) => ({
...housemap,
id: Math.random(),
}));
} else {
house = (houses as House[]).map((housemap) => ({
...housemap,
id: Math.random(),
}));
}
if (typeof filter === "function") {
return house.filter(filter);
}
return house;
}
console.log(
findHouses(JSON.stringify(houses), ({ name }) => name === "Atreides")
);
console.log(findHouses(houses, ({ name }) => name === "Harkonnen"));
const houses: House[] = [
{ name: "Atreides", planets: "Calladan" },
{ name: "Corrino", planets: ["Kaitan", "Salusa Secundus"] },
{ name: "Harkonnen", planets: ["Giedi Prime", "Arrakis"] },
];
interface House {
name: string;
planets: string | string[];
}
interface HouseWithID extends House {
ID: string;
}
type FilterFn = (house: House) => boolean;
function findHouses(houses: string): HouseWithID[];
function findHouses(houses: string, filter: FilterFn): HouseWithID[];
function findHouses(houses: House[]): HouseWithID[];
function findHouses(houses: House[], filter: FilterFn): HouseWithID[];
function findHouses(arg1: unknown, arg2?: FilterFn): HouseWithID[] {
let houses: House[] = [];
// Parse if arg1 is a string
if (typeof arg1 === "string") {
houses = JSON.parse(arg1);
} else if (typeof arg1 === "object") {
houses = arg1 as House[];
}
// Filter if there is a filter function
houses = arg2 ? houses.filter(arg2) : houses;
// Create the houses with IDs and return them
return houses.map((house, idx) => ({
ID: `${house.name}#${idx}`,
...house,
}));
}
console.log(
findHouses(JSON.stringify(houses), ({ name }) => name === "Atreides")
);
console.log(findHouses(houses, ({ name }) => name === "Harkonnen"));
import houses from './houses.json'
interface House {
name: string
planets: string | string[]
}
interface HouseWithID extends House {
id: number
}
function findHouses(houses: string): HouseWithID[]
function findHouses(houses: string, filter: (house: House) => boolean): HouseWithID[]
function findHouses(houses: House[]): HouseWithID[]
function findHouses(houses: House[], filter: (house: House) => boolean): HouseWithID[]
function findHouses(houses: string | House[], filter?: (house: House) => boolean): HouseWithID[] {
let houseList: House[] = []
if (typeof houses === 'string') {
houseList = JSON.parse(houses)
} else {
houseList = houses
}
const housesWithID: HouseWithID[] = houseList.map((house, index) => ({ id: index, ...house }))
if (filter) {
return housesWithID.filter(filter)
} else {
return housesWithID
}
}
console.log(findHouses(JSON.stringify(houses), ({ name }) => name === 'Atreides'))
console.log(findHouses(houses, ({ name }) => name === 'Harkonnen'))
const houses : House[] = [
{ "name": "Atreides", "planets": "Calladan" },
{ "name": "Corrino", "planets": ["Kaitan", "Salusa Secundus"] },
{ "name": "Harkonnen", "planets": ["Giedi Prime", "Arrakis"] }
]
interface House {
name: string,
planets: string | string[]
}
interface HouseWithID extends House {
id: number
}
function findHouses(houses: string): HouseWithID[];
function findHouses(
houses: string,
filter: (house: House) => boolean
): HouseWithID[];
function findHouses(houses: House[]): HouseWithID[];
function findHouses(
houses: House[],
filter: (house: House) => boolean
): HouseWithID[];
function findHouses(house: string | House[], filter?: (house: House)=>boolean): HouseWithID[]{
let housesWithId : HouseWithID[] | [] = [];
const addHouseId = (houseList: House[] = house as House[]): HouseWithID[] =>{
return houseList.map((house: House, index) => {
return {
...house,
id: index+1
}
})
}
const filterHouse = (housesWithId: HouseWithID[]) => {
return housesWithId.filter(filter!);
}
if(typeof house == 'string'){
const parsedHouse : House[] = JSON.parse(house)
housesWithId = addHouseId(parsedHouse)
}else{
housesWithId = addHouseId()
}
if(filter){
const house = filterHouse(housesWithId);
return house;
}
return housesWithId;
}
console.log(findHouses(JSON.stringify(houses), ({ name }) => name === 'Atreides'))
console.log(findHouses(houses, ({ name }) => name === 'Harkonnen'))
import houses from './houses.json';
interface House {
name: string;
planets: string|string[];
}
interface HouseWithID extends House{
id: string;
}
function findHouses(
input: House[]| string,
filter?: (house: House) => boolean
): HouseWithID[]{
const houses = typeof input == "string"? JSON.parse(input) : input;
return (filter? houses.filter(filter) : houses)
.map((h:House)=>{
return {...h, id: houses.indexOf(h)}
})
};
console.log(
findHouses(JSON.stringify(houses), ({ name }) => name === "Atreides")
);
console.log(findHouses(houses as any, ({ name }) => name === "Harkonnen"));
const houses = [
{ "name": "Atreides", "planets": "Calladan" },
{ "name": "Corrino", "planets": ["Kaitan", "Salusa Secundus"] },
{ "name": "Harkonnen", "planets": ["Giedi Prime", "Arrakis"] }
];
// Challenge #1
interface House {
name: string;
planets: string | string[];
}
interface HouseWithID extends House {
id: string;
}
function findHouses(houses: string): HouseWithID[];
function findHouses(
houses: string,
filter: (house: House) => boolean
): HouseWithID[];
function findHouses(houses: House[]): HouseWithID[];
function findHouses(
houses: House[],
filter: (house: House) => boolean
): HouseWithID[];
function findHouses(arg: string | House[], f?: (house: House) => boolean): HouseWithID[] {
let result: HouseWithID[] = [];
let values: House[] = [];
// Base
if (typeof arg === "string") {
values = JSON.parse(arg);
} else {
values = arg;
}
values.forEach((ar) => {
result.push({
...ar,
id: ar.name.charAt(0),
})
})
// filter
if (f) {
result = result.filter(f);
}
return result;
}
console.log(findHouses(JSON.stringify(houses), ({ name }) => name === "Atreides"));
console.log(findHouses(houses, ({ name }) => name === "Harkonnen"));
Here's an easy to understand solution
{ name: "Atreides", planets: "Calladan" },
{ name: "Corrino", planets: ["Kaitan", "Salusa Secundus"] },
{ name: "Harkonnen", planets: ["Giedi Prime", "Arrakis"] },
];
interface House {
name: string;
planets: string | string[];
}
interface HouseWithID {
name: string;
planets: string | string[];
id: number;
}
function findHouses(houses: string): HouseWithID[];
function findHouses(
houses: string,
filter: (house: House) => boolean
): HouseWithID[];
function findHouses(houses: House[]): HouseWithID[];
function findHouses(
houses: House[],
filter: (house: House) => boolean
): HouseWithID[];
function findHouses(
input: string | House[],
filter?: (house: House) => Boolean
) {
const temp = (
typeof input === "string" ? JSON.parse(input) : input
) as House[];
let filteredHouses = filter ? temp.filter(filter) : temp;
return filteredHouses.map(
(house, id): HouseWithID => ({
...house,
id,
})
);
}
console.log(
findHouses(JSON.stringify(houses), ({ name }) => name === "Atreides")
);
console.log(findHouses(houses, ({ name }) => name === "Harkonnen"));
in the tsconfig.json file you can enable "resolveJsonModule": true, so you can import the json file as import housesData from "./data/houses.json";
that way is an array
interface House {
name: string;
planets: string | string[];
}
const houses: House[] = [
{ name: "Atreides", planets: "Calladan" },
{ name: "Corrino", planets: ["Kaitan", "Salusa Secundus"] },
{ name: "Harkonnen", planets: ["Giedi Prime", "Arrakis"] },
];
interface HouseWithID extends House {
id: number;
}
type FilterFunction = (houses: House) => boolean;
function addHouseId(houses: House[]): HouseWithID[] {
return houses.map((house, index) => {
const newHouse: HouseWithID = { ...house, id: index };
return newHouse;
});
}
function findHouses(houses: string): HouseWithID[];
function findHouses(houses: string, filter: FilterFunction): HouseWithID[];
function findHouses(houses: House[]): HouseWithID[];
function findHouses(houses: House[], filter: FilterFunction): HouseWithID[];
function findHouses(arg1: unknown, arg2?: FilterFunction): HouseWithID[] {
if (typeof arg1 === "string") arg1 = JSON.parse(arg1);
if (arg2) {
return addHouseId(arg1 as House[]).filter((house) => arg2(house));
} else {
return addHouseId(arg1 as House[]);
}
}
console.log(
findHouses(JSON.stringify(houses), ({ name }) => name === "Atreides")
);
console.log(findHouses(houses, ({ name }) => name === "Harkonnen"));
Hi @jherr ,
Thanks for your series.
Here's my solution :
import data from "./houses.json";
interface House {
name: string;
planets: string[];
}
interface HouseWithID {
Id: number;
House: House;
}
function findHouses(houses: string): HouseWithID[];
function findHouses(houses: string, filter?: (house: House) => boolean): HouseWithID[];
function findHouses(houses: House[]): HouseWithID[];
function findHouses(houses: House[], filter?: (house: House) => boolean): HouseWithID[];
function findHouses(houses: unknown, filter?: (house: House) => boolean): HouseWithID[] {
let housesWithId: HouseWithID[] = [];
var i = 1;
let houseArray = (typeof houses === `string` ? JSON.parse((houses as string)) : houses) as House[];
houseArray.map(h => {
if(filter?.(h))
housesWithId.push({Id: i, House: h});
i++;
});
return housesWithId;
}
console.log(
findHouses(JSON.stringify(data), ({ name }) => name === "Atreides")
);
console.log(findHouses(data as any, ({ name }) => name === "Harkonnen"));
import houses from "./houses.json";
interface House {
name: string;
planets: string | string[];
}
interface HouseWithID {
id: number;
house: House;
}
type FilterFunc = (house: House) => boolean;
function findHouses(houses: string): HouseWithID[];
function findHouses(houses: string, filter: FilterFunc): HouseWithID[];
function findHouses(houses: House[]): HouseWithID[];
function findHouses(houses: House[], filter: FilterFunc): HouseWithID[];
function findHouses(houses: unknown, filter?: unknown): HouseWithID[] {
let housesWithID: HouseWithID[] = (
typeof houses === "string" ? JSON.parse(houses) : houses
).map((house: House, index: number) => ({
house,
id: index + 1,
}));
if (typeof filter === "function") {
housesWithID = housesWithID.filter((house: HouseWithID) =>
(filter as FilterFunc)(house.house)
);
}
return housesWithID;
}
console.log(findHouses(JSON.stringify(houses)));
console.log(
findHouses(JSON.stringify(houses), ({ name }) => name === "Atreides")
);
console.log(findHouses(houses, ({ name }) => name === "Harkonnen"));
Ok, so here I go.
A little verbose, but I'm happy with it 😸