JavaScript中减少对象属性的最佳方法是什么?

时间:2015-12-23 01:47:11

标签: javascript algorithm

情况:

我有像

这样的对象
{ prop_1 : val_1, prop_2 : val_2, prop_3 : val_3 , ..., prop_N : val_N } 

我要移除所有不属于prop_iprop_jprop_K的属性?

除了蛮力"以外,最好的方法是做什么?的方式

var original = { prop_1 : val_1, prop_2 : val_2, prop_3 : val_3 , ..., prop_N : val_N };
var newguy = { prop_i : original.prop_i, prop_j : original.prop_j, prop_k : original.prop_k };
original = newguy;

????

4 个答案:

答案 0 :(得分:1)

你可以做一个帮助你做到这一点的功能。

(function() {
  'use strict';

  function copyOnly(obj, keysToPreserve) {
    var result = {};
    for (var i = 0, length = keysToPreserve.length; i < length; ++i) {
      var key = keysToPreserve[i];
      result[key] = obj[key];
    }
    return result;
  }

  function copyExclude(obj, keysToExclude) {
    var result = {};
    for (var key in obj) {
      if (obj.hasOwnProperty(key) && keysToExclude.indexOf(key) === -1) { // -1 means key doesn't exist in keysToExclude
        result[key] = obj[key];
      }
    }
    return result;
  }

  var original = {
    a: '1',
    b: '2',
    c: '3',
    d: '4',
    e: '5'
  };

  var toPreserve = ['a', 'b', 'c'];
  var result1 = copyOnly(original, toPreserve);
  
  var toExclude = ['d', 'e'];
  var result2 = copyExclude(original, toExclude);
  
  // result1 will have the same structure as result2
  
  document.getElementById('result').innerHTML = 'result1 = ' + JSON.stringify(result1) + '\n' + 'result2 = ' + JSON.stringify(result2);
})();
<pre id="result"></pre>

答案 1 :(得分:0)

这是一种非暴力的方式。它使用白名单,迭代它们,并从“oldguy”复制值。

var oldguy = {
  "prop_1": 1,
  "prop_2": 2,
  "prop_3": 3,
  "prop_i": "i",
  "prop_j": "j",
  "prop_k": "k",
  "prop_N": "N",
  "prop_z": "Z"
};

var newguy = {};

var keys_to_include = ['prop_i', 'prop_j', 'prop_k'];

keys_to_include.forEach(function(k){
    newguy[k] = oldguy[k];
});

$('#output').html( JSON.stringify(newguy,null,'  ') );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<pre><code id="output"></code></pre>

答案 2 :(得分:0)

简单.forEach.indexOf超过Object.keysdelete不匹配

function cleanExcept(o, whitelist) {
    Object.keys(o).forEach(k => whitelist.indexOf(k) !== -1 ? 0 : delete o[k]);
    return o;
}


var o = {foo: 'foo', bar: 'bar', fizz: 'fizz', buzz: 'buzz'};
cleanExcept(o, ['foo', 'fizz']); // Object {foo: "foo", fizz: "fizz"}

根据@dandavis使用对象缓存而不是.indexOf

function cleanExcept(o, whitelist) {
    var w = {};
    whitelist.forEach(k => w[k] = true);
    Object.keys(o).forEach(k => w[k] ? 0 : delete o[k]);
    return o;
}

修改此缓存只需获取所需的值并将其返回(即获得新的对象引用)

function cleanExcept(o, whitelist) {
    var w = {};
    whitelist.forEach(k => !(k in o) ? 0 : w[k] = o[k]);
    return w;
}

答案 3 :(得分:0)

在ES6中,你可以写

str1 <- "red.c:45:4 error: invalid identifier "

这通过定义一个函数来解决,该函数将其参数解构为某些属性值,并返回具有这些值的对象。然后在输入对象上调用该函数。

请参阅One-liner to take some properties from object in ES 6