如何使用模型ID作为键将模型对象数组转换为对象?

时间:2017-03-02 11:39:23

标签: javascript ruby-on-rails ecmascript-6 redux map-function

在Javascript中我有一组模型对象:

[  
   {  
      "id":13,
      "title":"Some title 1",
      "time": "friday"
      ...
   },
   {  
      "id":15,
      "title":"Some title 3",
      "time": "Saturday"
      ...
   },
   {  
      "id":16,
      ...
   },
   ...
]

(每个对象有超过2个值和属性) 我想得到一个对象,将数组中的每个id移动到key,如下所示:

{
  13: {
    title: "Some title 1",
    time: "Friday"
    ...
  },
  15: {
    title: "Some title 3",
    time: "Saturday"
    ...
  },
  16: {
    ...
  },
  ...
}

我使用Rails视图.to_json include: {}语法生成数组,因此rails中的答案也适用于我。我将使用Redux的结果对象作为初始状态,因此某种Redux答案也很棒。也会对es6和es5的答案感兴趣(我会使用es5的答案,因为Rails不在视图中编译es6,但后来我们移植到客户端应用程序,它也适用)。

6 个答案:

答案 0 :(得分:2)

一种简单的方法是在Ruby中迭代数组:

print (df)
   MONTH  WEEKDAY  EVAL    0
0      1        0     0  400
1      1        0     1   20
2      1        1     0  300
3      1        1     1   20
4      2        0     0  200
5      2        0     1   35
6      2        1     0  450
7      2        1     1   26
8      2        1     1  100 <-duplicate

df = df.groupby(['MONTH','WEEKDAY','EVAL'])['0'].mean().unstack()

df = df.sort_index(level=[1,0])
       .reset_index(level=0, drop=True)
       .add_prefix('EVAL_')
       .reset_index()
       .rename_axis(None, axis=1)
print (df)
   WEEKDAY  EVAL_0  EVAL_1
0        0     400      20
1        0     200      35
2        1     300      20
3        1     450      63 <- value is mean of (100 + 26)/2

答案 1 :(得分:1)

您可以使用reduce()创建对象,在内部可以使用Object.keys()forEach()循环来循环对象属性以创建内部对象。

var data = [{
  "id": 13,
  "title": "Some title 1",
  'lorem': 'ipsum'
}, {
  "id": 15,
  "title": "Some title 3",
}, {
  "id": 16,
}]

var result = data.reduce(function(r, e) {
  r[e.id] = {}
  Object.keys(e).forEach(function(k) {
    if(k != 'id') r[e.id] = Object.assign(r[e.id], {[k]: e[k]})
  })
  return r
}, {})

console.log(result)

另一种方法是使用reduce()两次。第一个创建一个外部对象,内部减少创建第一个对象内的每个对象。

var data = [{"id":13,"title":"Some title 1","lorem":"ipsum"},{"id":15,"title":"Some title 3"},{"id":16}]

var result = data.reduce(function(r, e) {
  r[e.id] = Object.keys(e).reduce(function(o, a) {
   if(a != 'id') o[a] = e[a]
    return o;
  }, {})
  return r;
}, {})

console.log(result)

答案 2 :(得分:1)

最简单的解决方案是迭代数组并将每个项目的副本附加到新对象:

let result = {};
for (let item of data) {
  let newObject = Object.assign({}, item);
  result[newObject.id] = newObject;
  delete newObject.id;
}

如果您以后不需要数据数组,它会变得更简单:

let result = {};
for (let item of data) {
  result[item.id] = item;
  delete item.id;
}

答案 3 :(得分:0)

使用以下代码

try {
            JSONArray jsonArray=new JSONArray("yourJsonString");
            for(int i=0;i<jsonArray.length();i++){


                JSONObject outer_jsonObject=new JSONObject();
                JSONObject inner_jsonObject=new JSONObject();

                inner_jsonObject.put("title",jsonArray.getJSONObject(i).getString("title"));
                outer_jsonObject.put(jsonArray.getJSONObject(i).getString("id"),inner_jsonObject);

            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

答案 4 :(得分:0)

我建议你采取以下方法。

对于每个titles,使用id键分配一个对象,并保留一组标题作为其值。

它看起来干净而且易于阅读,特别是当一个var arr=[{id:13,title:"Some title 1"},{id:15,title1:"Some title 3",title2:"Some title 4"},{id:16}], result = []; arr.forEach(function(v){ var obj = {}; var titles = {}; var titlesArr = []; Object.keys(v).forEach(function(c){ if (c != 'id') { titlesArr.push(v[c]); titles.titles = titlesArr; } }); obj.id = titles; result.push(obj); }); console.log(result);的标题很少时。

    public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button b1 = (Button) findViewById(R.id.button);
    Button b2 = (Button) findViewById(R.id.button_2);
    b1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent inte_next=new Intent(MainActivity.this, Screen.class)
            startActivity(inte_next);
        }
    });
    b2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent inte_next=new Intent(MainActivity.this, Screen2.class)
            startActivity(inte_next);

        }
    });

}




Screen.Java
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_2);
    }
}

答案 5 :(得分:0)

return users.reduce((results, u)=> (results[u.id] = u, results), {})