在Javascript lodash中合并两个对象时保留键的顺序

时间:2017-03-01 19:04:47

标签: javascript lodash

我有两个对象x和y

var x = { 1: 1, 2: 2, hi: "hi" };
var y = { hello: "hello", coffee: "coffee" };

我想将它们合并为一个。

_.extend(y, x);

我希望y中的所有键首先跟随x中的键。但是,这就是我在结果中得到的结果

{1: 1, 2: 2, hello: "hello", coffee: "coffee", hi: "hi"}

首先出现数字键,然后是y和x中的键。

我们如何让y中的所有键首先跟随x中的键?

2 个答案:

答案 0 :(得分:0)

如上所述,对象没有命令。虽然大多数浏览器都尊重订单,但如果您正在谈论非关键的内容,那么您可能能够放弃信任浏览器的行为(即使它不是规范 - 规范是没有秩序)。

更符合规范的方法是使用数组,例如:

/// Creates a septary type named `s3`, with a unit type named `s1`, each digit
/// stored in a `u8`, with three digits.
nary_type! { s3, s1, 7, u8, 3 }

http://codepen.io/cjke/pen/BWjPOO?editors=0010

如果出于某种奇怪的原因,你无法改变你的下拉菜单,你可以通过对象的方式来做(但请在开始时看到免责声明):

var x = { 1: 1, 2: 2, hi: "hi" };
var y = { hello: "hello", coffee: "coffee" };

var a = [];

_.mapValues(x, function(v, k) {
  a.push({ key: k, value: v });
});
_.mapValues(y, function(v, k) {
  a.push({ key: k, value: v });
})

// ES6 (no lodash):
var a = [
    ...x.map((value, key) => ({ key, value })),
    ...y.map((value, key) => ({ key, value })),
];

http://codepen.io/cjke/pen/BWjPqO?editors=0010

答案 1 :(得分:0)

我不确定lodash是否是此解决方案的要求,但我读到您正在使用此代码进行反应,因此JSX也在那里工作。我注意到键名与值相同。所以我认为我们可以删除其中一个。我选择将继承的密钥替换为由函数生成的数字密钥。 concat创建订单,分配数字键的forEach维护该订单。可能有更多雄辩的解决方案,但我希望这会有所帮助!

var x = { 1: 1, 2: 2, hi: "hi" };
var y = { hello: "hello", coffee: "coffee" };

function createObj(obj1, obj2) {
  let result = {};
  const arr = [...Object.values(obj2).concat(Object.values(obj1))];
  arr.forEach((v, i) => {
    result[i] = v;
  })
  return result
}

createObj(x, y)