在javascript对象中切片特定键

时间:2016-01-07 15:24:38

标签: javascript node.js

在rails中,我有一个特殊的slice method来保留Hash我需要的密钥。只允许散列中的必需键是非常方便的。

Node.js

中是否有这样的方法

5 个答案:

答案 0 :(得分:10)

在JavaScript中没有这样的方法,但是,在像lodash这样的库中,有一个名为_.pick的方法

var data = { a: 1, b: 2, c: 3 };
console.log(_.pick(data, 'a', 'c'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>

您可以通过lodash

安装npm
npm install lodash --save

然后将其发送到您的项目

var _ = require('lodash') // import all methods
// or just import pick method
// var pick = require('lodash/object/pick');

或者您可以使用新的ES功能实现自己的选择,例如

const data = { a: 1, b: 2, c: 3 };

const pick = (obj, ...args) => ({
  ...args.reduce((res, key) => ({ ...res, [key]: obj[key] }), { })
})

console.log(
  pick(data, 'a', 'b')
)

答案 1 :(得分:2)

类似于@Brandon Belvin所说的,这是一个等同的ES6:

/**
 * A pure function to pick specific keys from object, similar to https://lodash.com/docs/4.17.4#pick
 * @param {Object}obj: The object to pick the specified keys from
 * @param {Array}keys: A list of all keys to pick from obj
 */
const pick = (obj, keys) => 
  Object.keys(obj)
    .filter(i => keys.includes(i))
    .reduce((acc, key) => {
      acc[key] = obj[key];
      return acc;
    }, {})

// Test code
const data = { a: 1, b: 2, c: 3 };
console.log(pick(data, ['a', 'c']));

Here是我为常用功能实用程序创建的要点,包括pick()的定义,类似于https://lodash.com/docs/4.17.4#pick

答案 2 :(得分:1)

您可以使用已内置于JavaScript中的内容来实现此目的。这是一种与ES5兼容的快速方法(在ES2015中可以稍微简化一点):

function slice(object, keys) {
    return Object.keys(object)
        .filter(function (key) {
            return keys.indexOf(key) >= 0;
        })
        .reduce(function (acc, key) {
            acc[key] = object[key];
            return acc;
        }, {});
}

此方法故意不改变它正在检查的对象。因此,如果您想要更改原始对象,只需将slice的输出分配给原始变量。

var x = { a: 1, b: 2, c: 3, d: 4 };
var y = slice(x, [ 'b', 'd' ]);

console.log(x);
// { a: 1, b: 2, c: 3, d: 4 }

console.log(y);
// { b: 2, d: 4 }

这适用于只需要查看第一级键的简单应用程序,但如果需要,可以将其扩展为递归行为。

答案 3 :(得分:1)

这些是最酷的解决方案。

有线版本:https://stackoverflow.com/a/39333479/683157

const object = { a: 5, b: 6, c: 7  };
const picked = (({ a, c }) => ({ a, c }))(object);

console.log(picked); // { a: 5, c: 7 }

通用版本:https://stackoverflow.com/a/32184094/683157

const pick = (...props) => o => props.reduce((a, e) => ({ ...a, [e]: o[e] }), {});
pick('color', 'height')(elmo);

答案 4 :(得分:0)

在我看来,您有三种选择。

  1. delete您不需要的属性,或
  2. 复制/克隆对象,然后delete您不需要的属性。
  3. 在复制/克隆对象时应用一些过滤条件。
  4. 如果没有更多信息,很难知道复制/克隆对象的最佳方法,但正如您提到的哈希表,可能会假设您正在讨论对象文字。以下代码有效,但是否是“最佳”方法也许是其他人愿意评论的内容(另见this StackOverflow question)。

    var hashTable = {
        d1: '1',
        d2: '2',
        d3: '3',
        d4: '4',
        d5: '5',
        d6: '6'
    };
    var filter = new RegExp("d1|d3|d5");
    
    function cloneHashTable(table, conditions) {
        var obj = {};
    
        for (var h in table) {
            if (table.hasOwnProperty(h)) {
                if (h.match(conditions) !== null) obj[h] = table[h];
            }
        }
        return obj;
    }
    
    var hashClone = cloneHashTable(hashTable, filter);
    
    console.debug(hashTable);
    console.debug(hashClone);
    
    //=> Object { d1: "1", d2: "2", d3: "3", d4: "4", d5: "5", d6: "6" }
    //=> Object { d1: "1", d3: "3", d5: "5" }
    

    当然,只有当你知道表格中的内容并且知道你想要/需要什么时,这才有效。

    希望这有帮助。 :)