wake-up-neo.net

Wie kann ich ein Objekt in Javascript schneiden?

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);
11
JC Garcia

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);
8
Bergi

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'}] ]
25
trad
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'}]

3
rekinyz

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);

2
Amerzilla

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);
1
Mikhail Lipilin

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);

1
Ted Hopp

// 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' ]

0
Karim Temple

Sie können nicht, wenn es eine hat [Symbol.iterator] generatorfunktion und length-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);

0
Redu

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

0
jishi