Здесь было несколько проблем.Я думаю, что вы, возможно, сталкивались с асинхронной природой fetch, пытаясь передать обещание в функцию сортировки, а не ждать, пока оно разрешится, и объединить их в пакет Promise.all - один из способов справиться с этим.Также, как заметил кто-то в комментариях, вы используете деструктуризацию двух переменных с одинаковым именем, здесь два простых решения: не деструктурировать или использовать псевдоним.Надеюсь, это поможет
function getResults() {
const checkResult = res => res.ok ? res.json() : Promise.resolve({});
const joinMap = ({title, body:lbody}, {name,body:rbody}) => ({title,lbody, rbody,name});
const equiJoin = (xs, ys, primary, foreign, sel) => {
const ix = xs.reduce(
(ix, row) => ix.set(row[primary], row), new Map()
);
return ys.map(row => sel(ix.get(row[foreign]), row));
}
const posts = fetch("https://jsonplaceholder.typicode.com/posts")
.then(checkResult);
const comments = fetch("https://jsonplaceholder.typicode.com/comments")
.then(checkResult);
return Promise.all([posts, comments])
.then(([postData, commentData]) => {
const result = equiJoin(postData, commentData,"id", "postId", joinMap);
console.log(result);
})
.catch(err => console.error(err));
}
button {
background-color: white;
color: black;
border: 2px solid #555555;
border-radius: 4px;
text-decoration: none;
display: inline-block;
font-size: 16px;
margin: 4px 2px;
cursor: pointer;
}
button:hover {
background-color: #555555;
color: white;
}
input {
width: 20vw;
height: 10vh;
padding: 0.5%;
border-radius: 4px;
border: 1px solid black;
}
#results {
position: absolute;
border: 1px solid gray;
height: 60vh;
width: 60vw;
left: 20vw;
top: 10vw;
}
<input type="text" id="postIDinput" placeholder="Post ID" required="true"></input>
<button type="submit" onclick="getResults()">Submit</button>
<div id="results"></div>