使用分隔符组合对象数组的元素

时间:2012-09-25 13:30:29

标签: javascript prototype

这是一个简单的问题,有许多简单的解决方案,我试图找出哪个是最好的。我想要一个简洁易读的解决方案。

这是问题所在。我有一个对象数组,我想将几​​个对象成员组合成管道分隔的字符串。作为此数据的示例:

[
    {
        foo: 1,
        bar: 2
    },
    {
        foo: 10,
        bar: 20
    }
]

我希望能够像这样创建字符串:

foo = "1|10";
bar = "2|20";

如果项目存储在单独的数组中,这就像使用Array.join一样简单。

这是我目前的解决方案:

var foo = "";
var bar = "";

var firstItem = obj.splice(0,1)[0];
foo = firstItem.foo.toString();
bar = firstItem.bar.toString();

obj.forEach(function (item) {
    foo += "|" + item.foo.toString();
    bar += "|" + item.bar.toString();
​});

我还考虑使用Array.reduce的以下解决方案,但仍然缺乏对此的浏览器支持。我正在使用Prototype,遗憾的是it's Array.reducenative JS implementation完全不同。

var strings = obj.reduce(function (a, b) {
    return {
        a.foo.toString() + "|" + b.foo.toString(),
        a.bar.toString() + "|" + b.bar.toString()
    };
});

// value of strings is now:
// {
//     foo: "1|10",
//     bar: "2|20"
// }   

还有更优雅的方法吗?

1 个答案:

答案 0 :(得分:2)

你可以这样做:

function propsArrayJoin(arr, prop, glue) {
  var results = [];
  arr.forEach(function (item) {
    results.push(item[prop].toString());
​ });
  return results.join(glue);
}

obj = [
    {
        foo: 1,
        bar: 2
    },
    {
        foo: 10,
        bar: 20
    }
];

foo = propsArrayJoin(obj, 'foo', '|');
bar = propsArrayJoin(obj, 'bar', '|');