#javascript
#javascript
Вопрос:
У меня есть эти два массива :
const data = [
{ type: 'type1', location: 23 },
{ type: 'type2', location: 37 },
{ type: 'type3', location: 61 },
{ type: 'type4', location: 67 }
]
const com = [
{ name: "com1", location: 36 },
{ name: "com2", location: 60 }
]
И я хочу проверить, равно ли значение locationComment
в массиве com
1 locationMethod
в массиве data
, если да, то я хочу иметь что-то вроде этого :
const array = [
{type: 'type2', name: "com1"},
{type: 'type3', name: "com2"}
]
Вот мой код :
const result = data.map((x)=>{
const arr = [];
com.map((y)=>{
if(x.location == y.location 1){
arr.push({
type: x.type,
name: y.name,
location: x.location
})
}
})
return arr;
});
Это результат, который я получаю:
[ [],
[ { type: 'type2', name: 'com1', location: 37 } ],
[ { type: 'type3', name: 'com2', location: 61 } ],
[] ]
Ответ №1:
Поскольку вы не уверены, будет ли совпадение для каждого элемента в com
массиве, вам следует использовать reduce
:
const data = [
{ type: 'type1', location: 23 },
{ type: 'type2', location: 37 },
{ type: 'type3', location: 61 },
{ type: 'type4', location: 67 }
];
const com = [
{ name: "com1", location: 36 },
{ name: "com2", location: 60 }
];
const output = com.reduce((a, { name, location }) => {
const found = data.find(item => item.location === location 1);
if (found) {
a.push({ type: found.type, name });
}
return a;
}, []);
console.log(output);
Если location
они уникальны, вы могли бы сократить временные затраты до O(N)
путем преобразования data
в объект, проиндексированный location
first:
const data = [
{ type: 'type1', location: 23 },
{ type: 'type2', location: 37 },
{ type: 'type3', location: 61 },
{ type: 'type4', location: 67 }
];
const com = [
{ name: "com1", location: 36 },
{ name: "com2", location: 60 }
];
const dataByLoc = data.reduce((a, item) => {
a[item.location] = item;
return a;
}, {});
const output = com.reduce((a, { name, location }) => {
const found = dataByLoc[location 1];
if (found) {
a.push({ type: found.type, name });
}
return a;
}, []);
console.log(output);
Комментарии:
1. что, если я хочу выполнить поиск по индексу? что-то вроде data[index].find
2.
data[index]
это будет возможно совпадающий объект , а не массив, поэтому.find
не имеет смысла. Вы могли бы сделатьdata[index].location === location 1
, который будет оцениватьtrue
, совпадает ли местоположение3. У меня работает jsfiddle.net/mzfvbxcs хотя это довольно странная вещь для выполнения
4. теперь я понял, это то, что мне нужно … спасибо за вашу помощь
Ответ №2:
Если вам не нравится решение в одну строку, следующий код также должен работать с использованием комбинации .map() и .find() .
const data = [
{ type: 'type1', location: 23 },
{ type: 'type2', location: 37 },
{ type: 'type3', location: 61 },
{ type: 'type4', location: 67 }
]
const com = [
{ name: "com1", location: 36 },
{ name: "com2", location: 60 }
]
// Final Array Output with merged properties
let finalArr = []
data.forEach(locationMethodObj => {
// Fetching the type
let finalObj = {
type: locationMethodObj.type
}
// Checking if a location match exists
const foundObj = com.find(locationCommentObj => (locationCommentObj.location 1) ===
locationMethodObj.location
)
// If a match is found, then append name and push
if(foundObj){
finalObj.name = foundObj.name
finalArr.push(finalObj)
}
})
console.log(finalArr)