如何在 Javascript 中切片对象?
How can I slice an object in Javascript?
我试图使用 Array.prototype 对对象进行切片,但它 returns 是一个空数组,除了传递参数之外,是否有任何切片对象的方法,或者只是我的代码有问题?谢谢!!
var my_object = {
0: 'zero',
1: 'one',
2: 'two',
3: 'three',
4: 'four'
};
var sliced = Array.prototype.slice.call(my_object, 4);
console.log(sliced);
我觉得可以帮到你:
var my_object = { 0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four' };
var sliced = Object.keys(my_object).map(function(key) { return my_object[key] }).slice(4);
console.log(sliced);
你不能,除非它有一个 [Symbol.iterator]
生成器函数并且 length
属性 存在。如;
var my_object = { 0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four', length:5 },
sliced;
my_object[Symbol.iterator] = function* (){
var oks = Object.keys(this);
for (var key of oks) yield this[key];
};
sliced = Array.prototype.slice.call(my_object, 2);
console.log(sliced);
你没有在你的问题中提到它,但它看起来非常像一个参数对象。
使用 Array.from()
将其转换为数组,然后像使用任何其他数组一样使用它。只要是可枚举对象即可。
有关旧版浏览器的 polyfill,请参阅 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from
尝试将 'length' 属性 添加到 my_object
,然后您的代码应该可以工作:
var my_object = {
0: 'zero',
1: 'one',
2: 'two',
3: 'three',
4: 'four',
length: 5
};
var sliced = Array.prototype.slice.call(my_object, 4);
console.log(sliced);
I was trying to slice an object using Array.prototype
, but it returns an empty array
那是因为它没有 .length
属性。它将尝试访问它,获取 undefined
,将其转换为一个数字,获取 0
,并从对象中切出最多那么多属性。因此,要获得所需的结果,您必须为其分配一个 length
,或手动遍历对象的迭代器:
var my_object = {0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four'};
my_object.length = 5;
console.log(Array.prototype.slice.call(my_object, 4));
var sliced = [];
for (var i=0; i<4; i++)
sliced[i] = my_object[i];
console.log(sliced);
// Works, but acts weird when things get serious
// Avoids screwing with the properties of my_object
// You don't get Object.create() until ES5.1
function lazySlice(obj, idx) {
var newObj = Object.create(obj, { length: {value: Object.keys(obj).length} }),
idx = idx || 0;
return Array.prototype.slice.call(newObj, idx);
}
// Only gives you own enumerable properties with keys "0" to n
// Preserves element order (based on key number)
// Ignores non-numbered keys
// You don't get Object.keys() until ES5
function enumSlice(obj, idx) {
var arr = [],
keys = Object.keys(obj),
idx = idx || 0;
for (var i = 0; i <= keys.length - 1; i++)
if (keys[i] >= idx && keys[i] % 1 === 0 && keys[i] >= 0 && keys[i].indexOf('e') < 0)
arr.push(obj[keys[i]]);
return arr;
}
var my_object = {
0: 'zero',
1: 'one',
2: 'two',
3: 'three',
4: 'four'
};
console.log(lazySlice(my_object, 3)); // [ 'three', 'four' ]
console.log(enumSlice(my_object, 3)); // [ 'three', 'four' ]
var mixed_object = {
"9": 'nine',
"2": 'two',
"1": 'one',
"7": 'seven',
"7.5": 'seven point five',
"1e4": 'sneaky',
"-4": 'negative four',
"0": 'zero',
"length": 35
};
console.log(lazySlice(mixed_object)); // [ 'zero', 'one', 'two', , , , , 'seven', ]
console.log(enumSlice(mixed_object)); // [ 'zero', 'one', 'two', 'seven', 'nine' ]
还没有人提到 Object.entries(),这可能是最灵活的方式。此方法在枚举属性时使用与 for..in
相同的顺序,即属性最初输入对象的顺序。您还可以获得包含 属性 和 value 的子数组,因此您可以使用任何一个或两者。最后,您不必担心属性是数字的或设置额外的长度 属性(就像您在使用 Array.prototype.slice.call()
时所做的那样)。
这是一个例子:
const obj = {'prop1': 'foo', 'prop2': 'bar', 'prop3': 'baz', 'prop4': {'prop': 'buzz'}};
您想分割前两个值:
Object.entries(obj).slice(0,2).map(entry => entry[1]);
//["foo", "bar"]
所有的键?
Object.entries(obj).slice(0).map(entry => entry[0]);
//["prop1", "prop2", "prop3", "prop4"]
最后一个键值对?
Object.entries(obj).slice(-1)
//[ ['prop4', {'prop': 'buzz'}] ]
var obj = {0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four'};
var result = Object.keys(obj).slice(0,2).map(key => ({[key]:obj[key]}));
console.log(result);
[ { '0': 'zero' }, { '1': 'one' } ]
您可以 reduce
Object.keys
函数的结果
const myObject = {
0: 'zero',
1: 'one',
2: 'two',
3: 'three',
4: 'four'
};
const sliced = Object.keys(myObject).slice(0, 2).reduce((result, key) => {
result[key] = myObject[key];
return result;
}, {});
console.log(sliced);
最好的现代解决方案是 Object.fromEntries 和 Object.entries.
const foo = {
one: 'ONE',
two: 'TWO',
three: 'THRE',
four: 'FOUR',
}
const sliced = Object.fromEntries(
Object.entries(foo).slice(1, 3)
)
console.log(sliced)
const res = Object.fromEntries(Object.entries(my_object).slice(0,4));
我试图使用 Array.prototype 对对象进行切片,但它 returns 是一个空数组,除了传递参数之外,是否有任何切片对象的方法,或者只是我的代码有问题?谢谢!!
var my_object = {
0: 'zero',
1: 'one',
2: 'two',
3: 'three',
4: 'four'
};
var sliced = Array.prototype.slice.call(my_object, 4);
console.log(sliced);
我觉得可以帮到你:
var my_object = { 0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four' };
var sliced = Object.keys(my_object).map(function(key) { return my_object[key] }).slice(4);
console.log(sliced);
你不能,除非它有一个 [Symbol.iterator]
生成器函数并且 length
属性 存在。如;
var my_object = { 0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four', length:5 },
sliced;
my_object[Symbol.iterator] = function* (){
var oks = Object.keys(this);
for (var key of oks) yield this[key];
};
sliced = Array.prototype.slice.call(my_object, 2);
console.log(sliced);
你没有在你的问题中提到它,但它看起来非常像一个参数对象。
使用 Array.from()
将其转换为数组,然后像使用任何其他数组一样使用它。只要是可枚举对象即可。
有关旧版浏览器的 polyfill,请参阅 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from
尝试将 'length' 属性 添加到 my_object
,然后您的代码应该可以工作:
var my_object = {
0: 'zero',
1: 'one',
2: 'two',
3: 'three',
4: 'four',
length: 5
};
var sliced = Array.prototype.slice.call(my_object, 4);
console.log(sliced);
I was trying to slice an object using
Array.prototype
, but it returns an empty array
那是因为它没有 .length
属性。它将尝试访问它,获取 undefined
,将其转换为一个数字,获取 0
,并从对象中切出最多那么多属性。因此,要获得所需的结果,您必须为其分配一个 length
,或手动遍历对象的迭代器:
var my_object = {0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four'};
my_object.length = 5;
console.log(Array.prototype.slice.call(my_object, 4));
var sliced = [];
for (var i=0; i<4; i++)
sliced[i] = my_object[i];
console.log(sliced);
// Works, but acts weird when things get serious
// Avoids screwing with the properties of my_object
// You don't get Object.create() until ES5.1
function lazySlice(obj, idx) {
var newObj = Object.create(obj, { length: {value: Object.keys(obj).length} }),
idx = idx || 0;
return Array.prototype.slice.call(newObj, idx);
}
// Only gives you own enumerable properties with keys "0" to n
// Preserves element order (based on key number)
// Ignores non-numbered keys
// You don't get Object.keys() until ES5
function enumSlice(obj, idx) {
var arr = [],
keys = Object.keys(obj),
idx = idx || 0;
for (var i = 0; i <= keys.length - 1; i++)
if (keys[i] >= idx && keys[i] % 1 === 0 && keys[i] >= 0 && keys[i].indexOf('e') < 0)
arr.push(obj[keys[i]]);
return arr;
}
var my_object = {
0: 'zero',
1: 'one',
2: 'two',
3: 'three',
4: 'four'
};
console.log(lazySlice(my_object, 3)); // [ 'three', 'four' ]
console.log(enumSlice(my_object, 3)); // [ 'three', 'four' ]
var mixed_object = {
"9": 'nine',
"2": 'two',
"1": 'one',
"7": 'seven',
"7.5": 'seven point five',
"1e4": 'sneaky',
"-4": 'negative four',
"0": 'zero',
"length": 35
};
console.log(lazySlice(mixed_object)); // [ 'zero', 'one', 'two', , , , , 'seven', ]
console.log(enumSlice(mixed_object)); // [ 'zero', 'one', 'two', 'seven', 'nine' ]
还没有人提到 Object.entries(),这可能是最灵活的方式。此方法在枚举属性时使用与 for..in
相同的顺序,即属性最初输入对象的顺序。您还可以获得包含 属性 和 value 的子数组,因此您可以使用任何一个或两者。最后,您不必担心属性是数字的或设置额外的长度 属性(就像您在使用 Array.prototype.slice.call()
时所做的那样)。
这是一个例子:
const obj = {'prop1': 'foo', 'prop2': 'bar', 'prop3': 'baz', 'prop4': {'prop': 'buzz'}};
您想分割前两个值:
Object.entries(obj).slice(0,2).map(entry => entry[1]);
//["foo", "bar"]
所有的键?
Object.entries(obj).slice(0).map(entry => entry[0]);
//["prop1", "prop2", "prop3", "prop4"]
最后一个键值对?
Object.entries(obj).slice(-1)
//[ ['prop4', {'prop': 'buzz'}] ]
var obj = {0: 'zero', 1: 'one', 2: 'two', 3: 'three', 4: 'four'};
var result = Object.keys(obj).slice(0,2).map(key => ({[key]:obj[key]}));
console.log(result);
[ { '0': 'zero' }, { '1': 'one' } ]
您可以 reduce
Object.keys
函数的结果
const myObject = {
0: 'zero',
1: 'one',
2: 'two',
3: 'three',
4: 'four'
};
const sliced = Object.keys(myObject).slice(0, 2).reduce((result, key) => {
result[key] = myObject[key];
return result;
}, {});
console.log(sliced);
最好的现代解决方案是 Object.fromEntries 和 Object.entries.
const foo = {
one: 'ONE',
two: 'TWO',
three: 'THRE',
four: 'FOUR',
}
const sliced = Object.fromEntries(
Object.entries(foo).slice(1, 3)
)
console.log(sliced)
const res = Object.fromEntries(Object.entries(my_object).slice(0,4));