Фильтровать несколько объектов массива с несколькими свойствами - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь создать функцию фильтра, где она может возвращать результат данных, которые соответствуют значению, которое я ищу, из заданного набора строковых ключей

пример массива:

let data = [
 { id:1 , data:{ name:"sample1",address:{ cat:"business" } } },
 { id:2 , data:{ name:"sample2",address:{ cat:"office"  }  } },
 { id:3 , data:{ name:"sample3",address:{ cat:"office"  } } },
 { id:4 , data:{ name:"sample4",address:{ cat:"office"  }  } }
 { id:5 , data:{ name:"sample5",address:{ cat:"home"  } } }
 { id:6 , data:{ name:"sample6",address:{ cat:"home"  }  } }
]



function filter( collection , value ,key ){
  //code 
}


let result = filter( data , "business" , [ "data","address","cat" ] )

console.log(result)

ожидаемый результат:

{id: 1, данные: {name: "sample1", адрес: {cat: "business"}}},

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

Вы можете попробовать код ниже.

Пожалуйста, прокомментируйте, если это не удовлетворит вашу проблему или вы хотите добавить больше функциональности в код.Я обновлю свой ответ.

function filter( collection , value ,key ){
     for(var obj of collection) {
           if(obj[key[0]][key[1]][key[2]] == value)
           { 
               return obj
           }
     }
     return null;
}
0 голосов
/ 30 мая 2018
function filter( collection , value ,key ){
  const getNestedObjectValue = (nestedObject, propertyPath) => {
      return propertyPath.reduce((obj, key) =>
          (obj && obj[key] !== 'undefined') ? obj[key] : undefined, nestedObject);

  };
  return collection.filter( item => getNestedObjectValue(item, key) === value);
}

Функция фильтра будет возвращать массив совпадающих объектов при наличии совпадения и пустой массив при отсутствии совпадения

let result = filter( data , "business" , [ "data","address","cat" ] );

console.log(result); // [{"id":1,"data":{"name":"sample1","address":{"cat":"business"}}}]

let result2 = filter( data , "office" , [ "data","address","cat" ] );

console.log(result2); //[{"id":2,"data":{"name":"sample2","address":{"cat":"office"}}},{"id":3,"data":{"name":"sample3","address":{"cat":"office"}}},{"id":4,"data":{"name":"sample4","address":{"cat":"office"}}}]

let result3 = filter( data , "vacation" , [ "data","address","cat" ] );

console.log(result2); // [] 
0 голосов
/ 30 мая 2018

Вы можете использовать filter для поиска данных.Используйте reduce для создания ключей.

Примечание: filter возвращает массив соответствующих элементов.Если вы предпочитаете только первый матч, вы можете использовать find

let data = [
  { id:1 , data:{ name:"sample1",address:{ cat:"business" } } },
  { id:2 , data:{ name:"sample2",address:{ cat:"office"  }  } },
  { id:3 , data:{ name:"sample3",address:{ cat:"office"  } } },
  { id:4 , data:{ name:"sample4",address:{ cat:"office"  }  } },
  { id:5 , data:{ name:"sample5",address:{ cat:"home"  } } },
  { id:6 , data:{ name:"sample6",address:{ cat:"home"  }  } }
];


function filter(collection, value, key) {
  return collection.filter(o => key.reduce((c, v) => c[v] || {}, o) === value);
}

let result = filter(data, "business", ["data", "address", "cat"])

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