I know, that there are many similar questions like this, but I cannot find an answer to my case.
So I am struggling with the following:
I have two array of objects which I am looping trough each other and am trying to fish out a street name. The catch is, to get only the name, which is nearest. I'll explain it below:
const obj1 = [
{ name: "I am the one and only", address: "street name 123, 456" },
{ name: "I am here only to fill up the place", address: "to not be a 1 element long array of objects"}
]
const obj2 = [
{ name: "testA", street: "street name 123" },
{ name: "testB", street: "street name 1" },
{ name: "testC", street: "street name" }
]
for ( let i of obj1 ) {
for ( let j of obj2 ) {
if(i.address.includes(j.street)) {
console.log(i, j)
}
}
}
expected output:
{
address: "street name 123, 456",
name: "I am the one and only"
}, {
name: "testA",
street: "street name 123"
}
what I got:
{
address: "street name 123, 456",
name: "I am the one and only"
}, {
name: "testA",
street: "street name 123"
}
{
address: "street name 123, 456",
name: "I am the one and only"
}, {
name: "testB",
street: "street name 1"
}
{
address: "street name 123, 456",
name: "I am the one and only"
}, {
name: "testC",
street: "street name"
}
Link to my playground: CodeSandboxLink
My question is, how to achieve my expected result? Tried it with regex, but it cannot find any formula, that could help in my case.
An approach.
You could build a score list and choose the one with the largest score.
The score is made of matching strings and their length.
const
data1 = [{ name: "I am the one and only", address: "street name 123, 456" }, { name: "I am here only to fill up the place", address: "to not be a 1 element long array of objects"}],
data2 = [{ name: "testA", street: "street name 123" }, { name: "testB", street: "street name 1" }, { name: "testC", street: "street name" }],
scores = {};
data1.forEach(({ address }, i) => {
data2.forEach(({ street }, j) => {
if (address.includes(street)) scores[[i, j].join('|')] = street.length / address.length;
});
});
console.log(scores);