【问题标题】:javascript sort array of objects by array of stringsjavascript按字符串数组对对象数组进行排序
【发布时间】:2019-11-24 07:13:27
【问题描述】:

有没有索引的数据结构:

const data = [{
        "B": {
            "value": 1,
        },
        "D": {
            "value": "45"
        },
        "E": {
            "value": "234"
        },
        "A": {
            "value": "543"
        },
        "C": {
            "value": "250"
        }
    }, {
        "B": {
            "value": 6,
        },
        "D": {
            "value": "234"
        },
        "E": {
            "value": "67"
        },
        "A": {
            "value": "78"
        },
        "C": {
            "value": "12"
        }
    }
   ]

和上面的数据数组应该被排序的字符串数组:

const strings = ["E", "C", "B", "A", "D"];

是否有解决方案按字符串对数据数组进行排序以获得最终结果,例如:

   [{
        "E": {
            "value": "234",
        },
        "C": {
            "value": "45"
        },
        "B": {
            "value": 1
        },
        "A": {
            "value": "543"
        },
        "D": {
            "value": "250"
        }
    }...

【问题讨论】:

  • 为此,您应该使用 Map 代替(在迭代时保证插入顺序)。
  • 对象字符串键是按插入顺序排序的——但是这不能总是得到保证。改用数组
  • @AluanHaddad 我知道,这就是为什么我说要使用数组,我没有完成我的编辑:)
  • 很可能这是一个 XY 问题

标签: javascript arrays sorting javascript-objects


【解决方案1】:

是的,其实很简单。

const data = [{
        "B": {
            "value": 1,
        },
        "D": {
            "value": "45"
        },
        "E": {
            "value": "234"
        },
        "A": {
            "value": "543"
        },
        "C": {
            "value": "250"
        }
    }, {
        "B": {
            "value": 6,
        },
        "D": {
            "value": "234"
        },
        "E": {
            "value": "67"
        },
        "A": {
            "value": "78"
        },
        "C": {
            "value": "12"
        }
    }
   ]

const strings = ["E", "C", "B", "A", "D"];

const sorted = data.map(obj => {
  const res = {};
  strings.forEach(key => res[key] = obj[key]);
  return res;
});

console.log(sorted);

但是 javascript 不保证对象内部变量的顺序,所以你不应该依赖它。要对其进行排序,您必须使用 i.e. 数组,它不会是完全相同的数据结构,但它是相似的,并且可以确保排序。

const data = [{
        "B": {
            "value": 1,
        },
        "D": {
            "value": "45"
        },
        "E": {
            "value": "234"
        },
        "A": {
            "value": "543"
        },
        "C": {
            "value": "250"
        }
    }, {
        "B": {
            "value": 6,
        },
        "D": {
            "value": "234"
        },
        "E": {
            "value": "67"
        },
        "A": {
            "value": "78"
        },
        "C": {
            "value": "12"
        }
    }
   ]

const strings = ["E", "C", "B", "A", "D"];

const sorted = data.map(obj => {
  const res = [];
  strings.forEach(key => {
    const newObj = {};
    newObj[key] = obj[key];
    res.push(newObj)
  });
  return res;
});

console.log(sorted);

【讨论】:

  • 现在扔一个数字键,看看 Object.keys 返回什么。顺序不同
猜你喜欢
  • 2014-07-10
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 2017-07-13
  • 2021-06-27
相关资源
最近更新 更多