如何通过类似数组的对象的键移动值?

时间:2017-09-06 07:54:21

标签: javascript

对于我可以做的array

array.push(array.shift())



var array = [0, 1, 2, 3, 4, 5];
array.push(array.shift())

console.log(array); // [1, 2, 3, 4, 5, 0]




如何对object执行相同操作?

输入

var object = {0: 'Fiat', 1: 'Audi', 2: 'BMW', 3: 'Citroën'}

如何将{0: 'Fiat'}移至object

的末尾

预期输出:

{0: 'Audi', 1: 'BMW', 2: 'Citroën', 3: 'Fiat'}

7 个答案:

答案 0 :(得分:4)

您可以使用以下方式

var object = {0: 'Fiat', 1: 'Audi', 2: 'BMW', 3: 'Citroën'};

var result = Object.keys(object).map(e => object[e]);
//console.log(result);

result.push(result.shift());
//console.log(result);

let ans = Object.assign({}, result);
console.log(ans);

答案 1 :(得分:2)

您可以使用给定的键将对象转换为数组的索引,应用移位并转换回对象。

var object = { 0: 'Fiat', 1: 'Audi', 4: 'BMW', 5: 'Citroën' },
    array = Object.keys(object).reduce((r, k, i) => (r[i] = object[k], r), []);

array.push(array.shift());

console.log(Object.assign({}, array)); // { 0: "Audi", 1: "BMW", 2: "Citroën", 3: "Fiat" }

一种不同的方法,同时尊重钥匙。

var object = { 0: 'Fiat', 1: 'Audi', 4: 'BMW', 5: 'Citroën' },
    keys = Object.keys(object);
    result = Object.assign(...keys.map((k, i) => ({ [k]: object[keys[(i + 1) % keys.length]] })));

console.log(result); // { 0: "Audi", 1: "BMW", 4: "Citroën", 5: "Fiat" }

答案 2 :(得分:1)

对象的属性对它们可能出现的顺序没有任何保证,简明说明没有概念作为顺序。我认为您需要更多思考并找到另一种解决方案,而不依赖于属性顺序。

答案 3 :(得分:1)

您可以将对象转换为数组,对数组进行重新排序并将数组转换回对象:



function toObject(arr) {
  var rv = {};
  for (var i = 0; i < arr.length; ++i)
    rv[i] = arr[i];
  return rv;
}

function toArray(object) {
  return Object.keys(object).map(function (key) { return object[key]; });
}


var object = {0: 'Fiat', 1: 'Audi', 2: 'BMW', 3: 'Citroën'}
var array = toArray(object);
array.push(array.shift());
object = toObject(array);

console.log(object);
&#13;
&#13;
&#13;

答案 4 :(得分:0)

您不应该依赖JavaScript中对象键的排序。它不是由标准定义的。根据定义,对象没有排序,因此对象没有“结束”

,没有任何顺序,将对象的某个键“移动”在任何地方都没有意义。

具有订单的数据结构是数组。

您的对象几乎类似于数组,因为它的所有键都是连续的数字,但它缺少lenght属性。使用length,您可以将其转换为Array.from(object)的实际数组。

答案 5 :(得分:0)

教学:对象通常基于Hash table进行按键查找。 因此,这通常意味着您没有订单。

myObj[key] => find value by computing hash of key => returns value

答案 6 :(得分:0)

正如Suren所说,该对象不保证插入顺序。我建议采用另一种方法:

const o = {0: 'Fiat', 1: 'Audi', 2: 'BMW', 3: 'Citroën'};
const k = Object.keys(o);
k.push(k.shift());
const result = k.map((v, i) => ({[i]: o[v]}))
   .reduce((acum, v) => Object.assign(acum, v), {});

这里的方法是创建和索引数组,应用逻辑(推送和移位),然后用map重新构建对象,然后用reduce将它们合并到一个对象中。我认为这可能会更短(只是减少),但我想将其分解为更清楚。