Javascript-仅保留给定值的所需属性列表

时间:2019-02-18 11:56:51

标签: javascript arrays json

我需要一个给出属性列表的函数,仅保留键中存在的值。

示例:

attrs = ['a', 'b', 'c']
obj = {'a': 1, 'b': 2, 'c': 3}
return = {'a': 1, 'b': 2, 'c': 3}

attrs = ['a', 'b']
obj = {'a': 1, 'b': 2, 'c': 3}
return = {'a': 1, 'b': 2}

这是我目前所拥有的,但是没有按预期工作:

this.keepKnownAttributes = function(attrs, obj) {
        let ret = {};
        attrs.forEach((attr) => {
            if(obj.hasOwnProperty(attr)){
                Object.assign(ret, {attr: obj[attr]});
            }
        });
        return ret;
    };

8 个答案:

答案 0 :(得分:2)

您可以使用.reduce从当前键数组中构建新对象:

const filterObj = (attr, obj) => 
  attr.reduce((acc, key) => (acc[key] = obj[key], acc), {})

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

答案 1 :(得分:1)

您可以使用Object.keys().reduce()方法:

const attrs1 = ['a', 'b', 'c']
const obj1 = {'a': 1, 'b': 2, 'c': 3}

const attrs2 = ['a', 'b']
const obj2 = {'a': 1, 'b': 2, 'c': 3}

const filterObj = (arr, obj) => Object.keys(obj)
                                      .filter(k => arr.includes(k))
                                      .reduce((r, c) => (r[c] = obj[c], r), {})
    
console.log(filterObj(attrs1, obj1));
console.log(filterObj(attrs2, obj2));

答案 2 :(得分:1)

只需使用reduce并传递一个空的Object。在每次迭代中,只需将属性从obj复制到accumulator,然后将其返回。

以下版本添加了attrs

中存在的所有元素

function test(attrs, obj) {
  return attrs.reduce(function(accumulator, currentValue) {
    accumulator[currentValue] = obj[currentValue];
    return accumulator;
  }, {});
}

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

以下版本仅添加attrsobj中都存在的元素

function test(attrs, obj) {
  return attrs.reduce(function(accumulator, currentValue) {
    if(obj.hasOwnProperty(currentValue))
       accumulator[currentValue] = obj[currentValue];
    return accumulator;
  }, {});
}

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

这是短箭头版本

function test(attrs, obj) {
  return attrs.reduce((a, c) => { a[c] = obj[c]; return a; }, {});
}

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

和田田。如果您只是Object.keys数组而不是Array.prototype.filter的属性,则无需使用reduceobject

答案 3 :(得分:0)

使用.hasOwnProperty()方法。如果对象具有该属性,则返回true。 Refer

var attrs = ['a', 'b']
var obj = {
  'a': 1,
  'b': 2,
  'c': 3
}
var obj1 = {};
attrs.forEach(e =>obj.hasOwnProperty(e)?obj1[e] = obj[e]:false)
console.log(obj1)

答案 4 :(得分:0)

您可以遍历对象的所有键,并将它们存储到包含要删除的键的数组中。以后,您可以简单地使用delete删除对象的属性。您可以使用Object.keys(obj)获取包含所有键的列表。

attrs1 = ['a', 'b', 'c']
obj1 = {
  'a': 1,
  'b': 2,
  'c': 3
}

attrs2 = ['a', 'b']
obj2 = {
  'a': 1,
  'b': 2,
  'c': 3
}

keepKnownAttributes = function(attrs, obj) {
  let keysToDelete = [];
  Object.keys(obj).forEach(key => {
    if (!attrs.includes(key)) {
      keysToDelete.push(key);
    }
  });

  keysToDelete.forEach(key => {
    delete obj[key];
  });

  return obj;
};

console.log(keepKnownAttributes(attrs1, obj1));
console.log(keepKnownAttributes(attrs2, obj2));

可以使用一些lambda函数来缩小示例

attrs1 = ['a', 'b', 'c']
obj1 = {
  'a': 1,
  'b': 2,
  'c': 3
}

attrs2 = ['a', 'b']
obj2 = {
  'a': 1,
  'b': 2,
  'c': 3
}

keepKnownAttributes = function(attrs, obj) {
  Object.keys(obj).filter(e => !attrs.includes(e)).map(key => delete obj[key]);
  return obj;
};

console.log(keepKnownAttributes(attrs1, obj1));
console.log(keepKnownAttributes(attrs2, obj2));

实际上,您无需返回任何内容,因为您修改了原始对象。干杯!

答案 5 :(得分:0)

您可以使用Array.prototype.filter()Array.prototype.reduce()进行操作。首先过滤掉attrs中存在的键,然后返回包含过滤后的键及其值的新对象。

let obj = {'a': 1, 'b': 2, 'c': 3}

function remove(obj,attrs){
  return Object.keys(obj).filter(a => attrs.includes(a)).reduce((ac,a) => {
    ac[a] = obj[a];
    return ac;
  },{})
}
console.log(remove(obj,['a','b','c']));
console.log(remove(obj,['a','b']));

答案 6 :(得分:0)

您可以使用reduce

const attrs = ['a', 'b']
const obj = {'a': 1, 'b': 2, 'c': 3}

const obj2 = attrs.reduce((acc, key) => 
  (acc[key] = obj[key], acc)
, {});

作为通用函数,如下所示:

const filterAttrsFrom = (target, attrs) =>
  attrs.reduce((acc, key) => 
    (acc[key] = target[key], acc)
  , {});

答案 7 :(得分:0)

这也有效;-)

function someName(attrs, obj) {
  let newObj = {};
  for (var object in obj) {
    if (attrs.includes(object)) {
      newObj[object] = obj[object];
    }
  }
  return newObj
}

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