Ich habe versucht, ein Objekt mithilfe von Array.prototype zu schneiden, gibt jedoch ein leeres Array zurück. Gibt es eine Methode, um Objekte außer der Übergabe von Argumenten zu schneiden, oder ist nur mein Code fehlerhaft? Vielen Dank!!
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);
Ich habe versucht, ein Objekt mit
Array.prototype
zu schneiden, aber es gibt ein leeres Array zurück
Das liegt daran, dass es keine .length
-Eigenschaft hat. Es wird versucht, darauf zuzugreifen, undefined
zu erhalten, es in eine Zahl umzuwandeln, 0
zu erhalten und höchstens so viele Eigenschaften aus dem Objekt zu entfernen. Um das gewünschte Ergebnis zu erzielen, müssen Sie ihm manuell eine length
oder einen Iterator durch das Objekt zuweisen:
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);
Bisher hat noch niemand Object.entries () erwähnt, was vielleicht der flexibelste Weg ist, dies zu tun. Diese Methode verwendet beim Auflisten von Eigenschaften die gleiche Reihenfolge wie for..in
, d. H. Die Reihenfolge, in der Eigenschaften ursprünglich in das Objekt eingegeben wurden. Sie erhalten auch Subarrays mit sowohl Eigenschaft als auch Wert, sodass Sie die beiden verwenden können. Schließlich müssen Sie sich keine Gedanken darüber machen, dass die Eigenschaften numerisch sind oder eine Eigenschaft mit zusätzlicher Länge festlegen (wie bei der Verwendung von Array.prototype.slice.call()
).
Hier ein Beispiel:
const obj = {'prop1': 'foo', 'prop2': 'bar', 'prop3': 'baz', 'prop4': {'prop': 'buzz'}};
Sie möchten die ersten beiden Werte in Scheiben schneiden:
Object.entries(obj).slice(0,2).map(entry => entry[1]);
//["foo", "bar"]
Alle Schlüssel?
Object.entries(obj).slice(0).map(entry => entry[0]);
//["prop1", "prop2", "prop3", "prop4"]
Das letzte Schlüsselwertpaar?
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': 'null'}, {'1': 'Eins'}]
Das Ergebnis der Object.keys
-Funktion kann reduce
sein
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);
Ich denke es kann dir helfen:
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);
Versuchen Sie, my_object
eine Eigenschaft 'length' hinzuzufügen. Dann sollte Ihr Code funktionieren:
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);
// 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' ]
Sie können nicht, wenn es eine hat [Symbol.iterator]
generatorfunktion undlength
-Eigenschaft ist vorhanden. Sowie;
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);
Sie erwähnen es nicht in Ihrer Frage, aber das sieht sehr nach einem Argumentobjekt aus.
Konvertieren Sie es mit Array.from()
in ein Array und verwenden Sie es wie jedes andere Array. Solange es ein zahlbares Objekt ist.
Eine Polyfill für ältere Browser finden Sie unter https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from