在rails中,我有一个特殊的slice
method来保留Hash
我需要的密钥。只允许散列中的必需键是非常方便的。
在 Node.js ?
中是否有这样的方法答案 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)
在我看来,您有三种选择。
delete
您不需要的属性,或delete
您不需要的属性。如果没有更多信息,很难知道复制/克隆对象的最佳方法,但正如您提到的哈希表,可能会假设您正在讨论对象文字。以下代码有效,但是否是“最佳”方法也许是其他人愿意评论的内容(另见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" }
当然,只有当你知道表格中的内容并且知道你想要/需要什么时,这才有效。
希望这有帮助。 :)