Javascript найти объект с соответствующим свойством в массиве объектов и получить другое свойство, если существует - PullRequest
0 голосов
/ 21 января 2019

Я ищу элегантное решение для следующего:

Во многих местах моего кода мне нужно найти объект, который совпадает с идентификатором в массиве объектов, а затем вернуть свойство вэтот объект.Указанный идентификатор может существовать или не существовать в массиве.

Самое короткое решение, которое я нашел, заключается в следующем:

(желая получить заголовокitem, если элемент существует, в противном случае ничего не возвращается)

arrayofObjects = [ { id: 'a3ff3d', title: 'Tesla', color: 'Red }, { id: 'r43wesd', title: 'AMC', color: 'Rust }]
wantedObject = { queryTitle: 'Desired Car', id: 'a3ff3d' }


let wantedProperty = arrayOfObjects.some( e => e.id === wantedObject.id) ? arrayOfObjects.find(e => e.id === wantedObject.id).title : 'None Found'

Однако это не элегантно и не так эффективно, как должно быть.Я бы предпочел, чтобы он был одним вкладышем вместо функции.

Ответы [ 4 ]

0 голосов
/ 21 января 2019

На самом деле, вы можете создать однострочный обобщенный метод для вашей структуры данных, который вы можете использовать многократно:

const arrayOfObjects = [
    {id: 'a3ff3d', title: 'Tesla', color: 'Red'},
    {id: 'r43wesd', title: 'AMC', color: 'Rust'}
];

const getKey = (a, id, key) => (f = a.find(x => x.id === id)) ? f[[key]] : "Not Found";

console.log(getKey(arrayOfObjects, "a3ff3d", "title"));
console.log(getKey(arrayOfObjects, "r43wesd", "color"));
console.log(getKey(arrayOfObjects, "someid", "color"));
0 голосов
/ 21 января 2019

Самый маленький метод не обязательно самый эффективный. Я бы сделал это так:

let wantedProperty = (arrayOfObjects.find(obj => obj.id === wantedObject.id) || {}).title || 'None Found';
0 голосов
/ 21 января 2019

Я думал о 2 возможных решениях.Первый, который я НЕ рекомендую:

array.reduce((acc, cur) => {
    return cur.id == searchedId ? cur.title : acc;
}, "None found");

Особенно, если вам нужно использовать его часто, избегайте «сложного» кода, даже если мы рассматриваем одну строку.

Второй вариант (если вы действительно не хотите использовать функцию) это:

Array.prototype.findOrElse = function(cb, objcb, retValue) {
    let findElem = this.find(elem => cb(elem));

    return objcb(findElem) || retValue;
}

Вы можете назвать это так:

array.findOrElse(elem => elem.id == searchedId, elem => elem.title, "None found");

Как правило, я не выбираю этот способ, потому что я предпочитаюне трогать нативные объекты, которые предоставляет js, но никто не запрещает это.


РЕДАКТИРОВАТЬ: Поскольку @PatrickRoberts заставил меня заметить, это не совсем ответ.Я только нашел 2 возможных решения, которые по разным причинам я не рекомендую.Функции имеют это преимущество: вам не нужно повторять один и тот же код, даже если он состоит из одной строки.Подумайте о возможной ситуации, когда вам может потребоваться получить другое свойство вместо title.

С другой стороны, настроить функцию внутри прототипа объекта Array сложно: вы пытаетесь сделать эту функцию настолько универсальной, насколько это возможно, с риском чрезмерного усложнения определения функции.

Так почему бы не пойти с вашей собственной определенной функцией?

0 голосов
/ 21 января 2019

Используйте Array # для поиска и уничтожения.

const data = [ { id: 'a3ff3d', title: 'Tesla', color: 'Red' }, { id: 'r43wesd', title: 'AMC', color: 'Rust' }];

function search(idToFind){
  const res = data.find(({id}) => id === idToFind);
  return res ? res.title : "Nothing found";
}


console.log(search('r43wesd'));
console.log(search('fail'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...