从数组动态向对象添加条件

时间:2020-10-09 08:49:52

标签: javascript

我有一个像这样的对象,需要将其发送到API-

var data = { 
    field : "category"
    value : "order"
}

现在,此API还需要一些作为嵌套对象发送的条件。像这样-

var data ={ 
    field : "category"
    value : "order"
    AND : {
      field : "circuit"
      value : "ninth"
      OR : {
         field : "second"
         value : "abc",
         //more conditions here possible //
      }
}

因此,基本上,条件嵌套在条件内。 编辑::注意-添加到条件数组中的每个条件都必须嵌套到先前条件中

现在,我有一系列条件-

conditionsArray = [
{filter: "AND", field: "circuit", value: "ninth"},
{filter: "OR", field: "second", value: "abc"}
]

如何以最佳方式将条件从此条件数组添加到数据对象?

var data = { 
    field : "category"
    value : "order"
}

谢谢您的时间。

编辑:对不起,我忘了添加到目前为止我已经尝试过的内容-

我一直试图只是形成一个对象,但这绝不是一个好的解决方案。

const check = () => {
    console.log(conditionsArray);
    const data: any = { ...fieldValue };
    conditionsArray.forEach((condition: any) => {
      const { filter, name, value } = condition;
      const { AND, OR, NOT } = data;
      if (AND || OR || NOT) {
        if (AND) {
          data["AND"][filter] = { name, value };
        }
        if (OR) {
          data["OR"][filter] = { name, value };
        }
        if (NOT) {
          data["NOT"][filter] = { name, value };
        }
      } else {
        data[filter] = { name, value };
      }
    });
    console.log(data,"log data");
  };

3 个答案:

答案 0 :(得分:1)

如果您的non-root项目应按出现的顺序添加到root中,则可以采用以下递归方式:

conditionsArray
data

答案 1 :(得分:1)

您可以缩小数组并返回嵌套对象以进行下一次迭代。

const 
    data = { field: "category", value: "order" },
    conditionsArray = [{ filter: "AND", field: "circuit", value: "ninth" }, { filter: "OR", field: "second", value: "abc" }];

conditionsArray.reduce((o, { filter, ...rest }) => o[filter] = rest, data);

console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:1)

使用递归:

function addConditions(data, conditions) {
    if (conditions.length == 0) { return data; }
    var topMostCondition = conditions[0];
    var objectToAdd = { field : topMostCondition.field, value : topMostCondition.value };
    data[topMostCondition.filter] = addConditions(objectToAdd, conditions.splice(1));
    return data;
}
相关问题