сравнить значение объекта и вернуть новый массив

#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)