Spread values to an object (Computed property names)
Your solution is okay; although I'd make appendOtherInfo() a local function of createOptions(). But the problem is, in terms of abstraction - you build a function that you want to re-use and that gives you the feeling it is generic enough for all future use cases for your drop down. However, there are two problems - your "generic" function is just generic enough for flat objects and cannot easily handle nested objects.

Furthermore because it's only argument is an object, different properties in it have different meanings - this is not good for code readability.

So my advice is, why bother writing something that is seemingly generic, but actually not generic enough that it will ever see proper reuse.

Instead simply use direct mappers; they are more readable and they give you the full flexibility, so instead of:

&lt;react-select options = { createOptions({
  data: people,
  valueKey: 'id',
  labelKey: 'name',
  type: 'type',
  capitalCity: 'city'
})}&gt;/


Simply do:

&lt;react-select options = { people.map(peopl =&gt; {
  value: peopl.id,
  label: peopl.name,
  type: peopl.type
  capitalCity: peopl.city
}
}&gt;/


(I did not look up &lt;react-select&gt;'s API):
Do not hide simple extracting and remapping behind functions if there is no need to - make code explicit and readable.

You can happily use destructuring with renaming and ..., if you only need to map label and value as well:

&lt;react-select options = { people.map(peopl =&gt; ({
  const {id: value, name: label, ...other} = peopl;
  return {value, name, ...other}})
)}&gt;/


Or to be explicit and combining above:

&lt;react-select options = { people.map(peopl =&gt; ({
  const {id: value, name: label, type, city: capitalCity} = peopl;
  return {value, name, type, capitalCity}})
)}&gt;/