1

我需要创建一个函数getPropertiesData(list),它接受一个属性列表和一个包含这些属性的对象,并且只返回列表中匹配的对象的属性。

插图:

function getPropertiesData(['x', 'y']){
    const o = {
        'x': 1, 
        'y': 2, 
        'z': 3
       }

    // Will return 
    return {
        'x': 1,
        'y': 2
       }
    // not including the 'z' variable since it was not specified as input in the list array
}

如何在 javascript 中做到这一点?

4

5 回答 5

2

您可以使用Object.entries获取对象的键/值对数组的数组。接下来,filter通过包含在数组中的条目wantedKeys数组。最后,使用 . 从选定的对中创建一个对象Object.fromEntries

const o = {a: 1, b: 2, c: 3};
const wantedKeys = ["a", "c"];

const selected = Object.fromEntries(
  Object.entries(o)
        .filter(([k, v]) => wantedKeys.includes(k))
);

console.log(selected);

这在大型对象上可能会很慢,因此您可以使用map并将filter复杂性绑定到wantedKeys数组。

如果你把它变成一个函数,那么硬编码这个对象是没有意义的。我也将其添加为参数:

const pickFromObj = (o, wantedKeys) => Object.fromEntries(
  wantedKeys.filter(e => e in o)
            .map(e => [e, o[e]])
);

console.log(pickFromObj({a: 1, b: 2, c: 3}, ["a", "c"]));

于 2020-03-10T15:07:16.633 回答
2

您可以Object.assign()为此要求使用方法,例如:

function getPropertiesData(arr) {
  const o = { 'x': 1, 'y': 2, 'z': 3 }
  return Object.assign({}, ...arr.map(a => ({[a]: o[a]})));
}

console.log(getPropertiesData(['x', 'y']))

如果您只需要获取对象中存在的键的值,则o可以使用:

function getPropertiesData(arr) {
  const o = { 'x': 1, 'y': 2, 'z': 3 }
  return Object.assign({}, ...arr.map(a => o.hasOwnProperty(a) ? ({[a]: o[a]}) : null));
}

console.log(getPropertiesData(['x', 'y']))
console.log(getPropertiesData(['w', 'x']))

于 2020-03-10T15:08:50.470 回答
2

只需通过将所需键映射到值来创建一个新对象。

function getPropertiesData(properties) {
    const o = { x: 1, y: 2, z: 3 };
    return Object.fromEntries(properties.map(k => [k, o[k]]));
}

console.log(getPropertiesData(['x', 'y']));

于 2020-03-10T15:36:51.717 回答
1

您可以通过迭代对象中的键/值对来做到这一点,并使用数组 reduce 来隔离您正在寻找的那些。在这里,reduce 在迭代所有对象值的同时构建一个新对象。

const getPropertiesData = (obj, props) =>
  Object.entries(obj)
    .reduce((result, [key, value]) =>
      props.includes(key) ? {...result, [key]:value} : result
    , {})

然后,您可以使用您的对象对其进行测试,o:

const o = {
 'x': 1, 
 'y': 2, 
 'z': 3
}

console.log(getPropertiesData(o, ['x', 'y']))
于 2020-03-10T15:06:46.747 回答
1

该函数应该接受一个对象 ,o和属性数组 , propsArray.prototype.reduce在输入上使用props来创建一个新的输出对象Object.assign

const getProperties = (o = {}, props = []) =>
  props.reduce
    ( (r, k) => Object.assign(r, { [k]: o[k] })
    , {}
    )

const result =
  getProperties({ a: 1, b: 2, c: 3 }, [ 'a', 'b', 'z' ])

console.log(result)
// { a: 1, b: 2, z: undefined }

于 2020-03-10T15:22:50.543 回答